보안
[시스템해킹] 드림핵 워게임 basic_exploitation_000
anstjwls
2024. 4. 3. 14:04
유형: Stack Overflow
- basic_exploitation_001.c
#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 함수를 보면 128바이트의 buf 생성 후 initialize 함수로 진입
initialize 함수에서는 stdin, stdout의 버퍼링을 비활성화해 입출력이 즉시 처리되도록 함
gets(buf)로 사용자 입력 받음 <- 버퍼 오버플로우 발생 가능
그리고 30초간 입력 하지 않으면 TIME OUT 출력되고 프로그램 종료
read_flag() 함수를 호출해야 플래그 출력
- 익스플로잇
gdb disas main 으로 버퍼 위치 확인
...
lea -0x80(%ebp),%eax -> ebp로부터 128바이트 위에 생성된다는 것 확인할 수 있음
그 위에 return address가 있으니까 132바이트만큼 덮어주고
info func로 read_flag 주소를 찾아서
return address에 read_flag주소 넣어주면
flag 출력됨