一些软安实验题记录
1.shellcode编写
使用dependency walker查找ExitProcess函数和MessageBoxA函数的真实地址
ExitProcess的地址在0x1B0BB+0x77E60000 = 0x77E7B0BB


MessageBoxA的地址在0x33D68+0x77DF0000 = 0x77E23D68


编写shellcode,在弹窗中输出1234


使用OD将shellcode的机器码导出

2.静态地址跳转注入
查找到dest的地址在0x0012FAF0

为淹没返回地址,需填充44字节buff,4位authenticated,4位EBP,并写入shellcode。输入如下

运行后弹出窗口

3.跳板注入
查找JMP ESP

输入如下

运行后弹出窗口

4.思考题
使用跳板进行shellcode注入,基本构造是填充位+JMP ESP+shellcode。
使用IDA打开程序,查看buff空间,需填充12字节

在OD中查找JMP ESP,这里选用77E2E32A这个地址

选择使用WinExec来打开记事本,该函数需要的参数有两个,一个控制参数和一个用于说明执行目标的字符串。
使用记事本打开指定文件的语句是:
WinExec("notepad shellcode",SW_SHOW)
也就是按这样的格式构造shellcode:
PUSH 5 //SW_SHOW
PUSH xxx //字符串
CALL WinExec
使用Dependency Walker查找WinExec的地址:0x77E78601

由于第一个字符串没有在原程序中,必须在shellcode中输入。将字符串的值跟在call指令后方,那么call指令前的push需要修改。
首先将esp的值赋给eax,然后对eax进行加减偏移使其指向字符串,最后push eax即可。通过调试和计算得到这里的偏移是13:
MOV EAX,ESP
ADD EAX,13
PUSH EAX
那么完整输入就是12字节填充+JMP ESP+函数调用机器码+字符串。

432143214321*汊wj嬆兝P鑭喸w悙notepad" "shellcode
输入,用OD调试程序。
在return时栈顶已经是JMP ESP。


成功来到了shellcode处。

call指令时,栈中已经压入了WinExec函数的两个参数。

成功打开shellcode.txt。


浙公网安备 33010602011771号