本次实践的对象是一个名为hf20145234的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
这几种思路,基本代表现实情况中的攻击目标
1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
2. 掌握反汇编与十六进制编程器
3. 能正确修改机器指令改变程序执行流程
4. 能正确构造payload进行bof攻击
5. Optional:进阶,Shellcode编程与注入
- (1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。
- (2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。
- (3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。
- (4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
- (5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
objdump -d hf0145234 | more
getShell
, foo
, main
:从图中可以看出该程序正常运行顺序是从main函数入口开始进行执行,而后调用foo函数,并没有对getShell函数进行调用,而我们可以通过修改main函数中call指令来将原本程序对于foo函数的调用改为对getShell函数的调用。
0x8048491 = 0x80484ba + 0xd7ffffff
,其中 0x80484ba
是原本下一条指令的地址, 0x8048491
为经过call指令修改后下一条指令的地址,机器指令中的 e8
是call指令的机器码因此想要调用getShell,只要修改 d7ffffff
为, getShell-80484ba
对应的补码 c3ffffff
就行了。
vi hf20145234
打开可执行文件hf20145234;
:%!xxd
将文件转换成16进制显示
/e8 d7
搜索查询需要修改的机器码位置,锁定位置后按 i
进入插入模式进行将 e8 d7
修改为 e8 c3 (04b0行)
:%!xxd -r
取消16进制显示,并输入 :wq
对文件的修改进行保存并退出(注:若不退出16进制显示直接保存,运行文件会出错)objdump -d pwnx | more
进行查看 发现call 后发生了变化
./hf20145234
查看运行结果
第一步依旧是输入反汇编指令objdump -d hf2 | more
进行分析,内容同上
gdb hf2
调试程序,
0x804847d
。接下来要确认下字节序,简单说是输入 11111111222222223333333344444444\x08\x04\x84\x7d
,还是输入 11111111222222223333333344444444\x7d\x84\x04\x08
。eip 0x34333231 0x34333231
,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08
。\x7d\x84\x04\x08
这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a
表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input
20145234黄斐《网络对抗技术》实验一,逆向及Bof基础实践
原文:http://www.cnblogs.com/taigenzhenjun/p/6505895.html