유형: 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 출력됨
'보안' 카테고리의 다른 글
[시스템해킹] NX & ASLR (0) | 2024.04.23 |
---|---|
[시스템해킹] Background: Calling Convention(함수 호출 규약) (0) | 2024.04.23 |
[시스템해킹] Background: x86 Assembly (0) | 2024.04.23 |
[시스템해킹] Background: Linux Memory Layout (0) | 2024.04.23 |
[시스템해킹]Background: 컴퓨터 구조, 레지스터, ... (0) | 2024.04.22 |