发布时间:2014-07-15 11:50:28作者:知识屋
一、静态分析
首先运行程序,看大致程序的功能。如下图所示,这个程序提供了一个internet操作系统,支持一定的命令(enable,ping等)。
用ida分析程序,main函数:
main函数中主要有3个子函数。对这3个子函数依次分析。
第一个函数sub_80489d0:
很容易看出是读取了/home/shitsco/password中的内容,存入到804c3a0地址处。
第二个函数sub_8048c30:
这个函数主要是读取一行用户的输入。
第三个函数sub_8048a50:这个函数较为复杂,主要是对用户的输入进行解析。
首先观察ebp不是和平常程序一样作为栈帧使用,这里用了指向一块内存。而这块内存正好为系统支持的命令(enable)。
通过后面分析,发现此块内存为一个结构体数组,存储命令信息。
该结构体如下:
struct CommandInfo { char *command;//命令名称,如enable int unknown;//未见使用 int Privilege; int argc;//参数个数,如命令ping需要另一个参数 pvoid handler; }
其中privilege是权限,如果为1表示命令需要enable成功后才能执行。内存804c3c0初始化为0,只有enable后,内存804c3c0才会变成1。
Handler表示该命令对应的处理函数。
最后以一个表统计了一下命令的信息:
Command | Privilege | Argc | Handler |
enable | 0 | 1 | sub_8049230 |
ping | 0 | 1 | sub_80493E0 |
tracert | 0 | 1 | sub_8049330 |
? | 0 | 1 | sub_80490C0 |
flag | 1 | 0 | sub_8048D40 |
shell | 0 | 0 | sub_8048CF0 |
set | 0 | 2 | sub_80494A0 |
show | 0 | 1 | sub_8048E50 |
credits | 0 | 0 | sub_8048CA0 |
quit | 0 | 0 | sub_8048CD0 |
disable | 0 | 0 | sub_8048CB0 |
通过对各处理函数分析,发现了flag的处理函数,直接打印了flag的内容,说明肯定是想让用户执行flag命令,但flag命令有权限限制,所以还必须通过enable函数。
enable 函数:
enable命令需要带一个参数,这个参数就是a1,如果a1不为空,就把a1作为password,如果a1为空,就让用户输入password。然后将输入的password与内存804c3a0(之前程序从password文件中读取的password)比较,如果一样,就enable成功。
从以上分析,可以知道需要知道password才行,但这文件在服务器上,猜测应该有信息泄露。
详细分析enable的处理函数,发现如下esp+4ch-34h处为用户输入的密码,而strcmp的返回值放在esp+4ch-14h中。如果用户输入的密码为32位,且不含回车,那么后面的printf将会将strcmp的返回值打印出来,如果为-1,说明输入的偏小,如果为1,说明输入偏大,如果=0,说明相当。根据strcmp的返回值,我们可以暴力猜出password中的每一位。
二、动态分析
为了能进行动态分析,需要在中创建2个文件: /home/shitsco/flag和/home/shitsco/password,并随意写入一些字节。password以x00结束。
动态分析,主要验证刚才strcmp处是否分析正确,在08049272处下断点。
0xbffff1e8指向了用户输入的密码123
单步运行到0×08049277
esp+0×38=0xbffff208,程序将strcmp的返回值eax放入0xvffff208,正好在用户输入的32字节之后。验证了静态分析的结果。
三、写出exp并测试
暴力获取password的py脚本如下:
port socket s = socket.socket() s.connect(("127.0.0.1", 8888)) while True: d = s.recv(4096) if '$' in d: break password = ' ' * 32; for i in range(32): for j in range(33, 127): tmp = list(password) tmp[i] = chr(j) tmp = ''.join(tmp) s.send("enable n") d = s.recv(4096) s.send(tmp + "n") d = s.recv(4096) print d if 'Successful' in d: password = ''.join(tmp) break if chr(255) in d: print chr(j - 1) tmp = list(password) tmp[i] = chr(j - 1) password = ''.join(tmp) break s.recv(4096) print password
exp测试:
nc开端口进行监听:
运行python脚本,得到password:
另外此处打印的不一定就是password,因为如果密码为bruT3m3hard3rb4by时,bruT3m3hard3rb4by与” bruT3m3hard3rb4by ”,比较,仍然会认为后者大,不会相等。
成功获得flag
2011-06-17
菜鸟简单抓肉鸡(如何抓肉鸡)
2012-02-21
电脑开机时出现lass.exe进程是病毒吗?
2014-06-12
自拍须谨慎!教你如何通过照片定位查看拍摄地点
2012-08-06
电脑病毒最基础知识
2012-02-28
黑客学员必须了解的C语言技术
2011-04-04
精典详细内网渗透专题文章
2012-12-05
教你破解Tp-Link的无线路由密码
2011-02-21
解决SecureCRT中文显示乱码
2012-05-11
QQ电脑管家和360哪个好?横评实测对比
2012-04-15
攻防实战:无线网络路由入侵过程
2017-05-26
设置电脑安全级别的方法 怎么设置电脑安全级别
2017-05-17
如何保护U盘文件的安全 保护U盘文件的安全的方法
2017-05-10
360安全卫士的新闻弹窗如何关闭 360安全卫士的新闻弹窗关闭的方法
2017-05-03
qq安全中心快速改密图解步骤 qq安全中心快速改密的方法
2017-04-20
360安全卫士怎么关闭新闻弹窗和推荐 360安全卫士关闭新闻弹窗和推荐的方法
2017-04-12
清理流氓软件新闻简单报的方法 怎么清理流氓软件新闻简单报
2016-02-01
腾讯DNSPod推出新公共DNS服务 119.29.29.29安全零劫持
2015-08-12
电脑离线就安全?这个软件能远程偷数据
2015-06-05
常见木马短信:这类短信千万别点 小心有病毒
2015-05-31
北京预警:“匿名者”黑客组织开展对华网络攻击