攻防世界 echo-server writeup
一. 知识点
(1)花指令
0x01 概念
花指令是,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种指令:jmp, call, ret的一些堆栈技巧,位置运算,等等。
0x02 常见花指令
0x03 如何去除花指令
第一步:
- 识别哪些是有用的数据,哪些是垃圾数据。
第二步:
- 把垃圾数据用nop(0x90h)填充。
(2)IDA出现"sp-analysis failed"
IDA官网解释:
大意是ida检测到,IDA有栈跟踪的功能,它在函数内部遇到ret(retn)指令时会做判断:栈指针的值在函数的开头/结尾是否一致,如果不一致就会在函数的结尾标注"sp-analysis failed" 。一般编程中,不同的函数调用约定(如stdcall&_cdcel call)可能会出现这种情况;另外,为了实现代码保护而加入代码混淆(特指用push/push+ret实现函数调用)技术也会出现这种情况。
二. 解题步骤
(1)拖进IDA反编译,查看伪代码,可以看到这里的函数调用很奇怪
(2)跟去这个函数,发现汇编代码很乱,有花指令插入
程序本应该跳转到loc_80487C1+3处,但这里并没有显示出来,由此判断程序被混淆,混入了花指令,需要去除花指令。
(3)将汇编代码转换成数据,发现0x80487C1处的字节是0xE8.
(4)使用IDA把它patch为0x90,转换为代码,汇编代码显示正常
(5)在上图中可以看到,0x080487F3处汇编代码也存在花指令,转换成数据后出现0xEB,也常被用于混淆
(6)将0xEBpatch为0x90,汇编代码恢复为nop,但下方又出现一出标红。但是标红代码的上两行代码是无条件跳转指令,所以没有影响。
(7)继续向下运行,eax被赋值为5,然后跳进loc_80488A3,进去后发现每次eax会减一,因此这是个循环,读输入的前5个字符
(8)回去将下面的标红代码改为nop,发现如果0x0804884F行不执行,函数就会陷入死循环。
xor eax, eax的结果一直为0,jz结果为0时跳转
(9)eax的值是根据dword_804A088的值来决定,按x查看交叉引用,看下dword_804A088这个地址的值是哪来的
(10)只有一个地方,跟过去看下,发现dword_804A088这个地址的值是在main函数中硬编码的1
(11)由此可知eax的值为1,需要把jz指令patch为jmp
test逻辑与运算结果为零,就把ZF(零标志)置1;
test eax,eax
当eax=0时,置z标志位为1,jz 跳转,jnz 不跳转
当eax=1时,置z标志位为0,jz 不跳转,jnz 跳转
(12)F5生成伪代码,可以看出就是比较输入的字符串的前五个字符与loc_8048816+1处是否相同
(13)回去发现是我们第(6)步没有管的花指令,按D转化成数据,发现是在代码段里存了一段数据。这里不要直接改机器码,改了之后会发现找不到字符串地址。
(14)点击编辑->修补文件->修补程序应用到输入文件,一定要保存!!!不然前面白干了。然后运行程序,输入字符串“F1@gA”,得到flag。
(15)运行报错解决
如果报错 libcrypto.so.1.0.0: cannot open shared object file: No such file or directory 是因为没有 libcrypto.so.1.0.0,我的系统有 64 位 libcrypto.so.1.0.0 但是没有 32 位的,因此需要安装 32 位的共享库。libssl 中带了 libcrypto。
命令行输入下面的指令即可
sudo apt-get install libssl1.0.0:i386
不过有的虚拟机可以,有的不行。我在kali输完还是不能运行,搞了一个多小时,试了网上各种方法都没用,换了个乌班图虚拟机这样就行了。有懂的童鞋可以告诉一下我。