虚拟机已经配好了,开发环境好了,剩下的就是不辞辛苦,写代码的事情了
­
高级语言写程序大家都见过,汇编也有一部分人用,但是用的不多,但是反汇编的魅力却很少有人注意
­
首先要说下shellcode的原理吧
基础知识应该是C++和ASM
­
随便贴段代码《缓冲区溢出教程》:
#include<windows.h> 
­
int main() 

LoadLibrary(“msvcrt.dll”); 
system(“command.com”); 
­
    return 0; 

//这个是开DOS窗口的代码,没什么普通,典型语法糖….. 
#include <windows.h> 
#include <winbase.h> 
­
typedef void (*MYPROC)(LPTSTR);        //定义函数指针 
­
int main() 

HINSTANCE LibHandle; 
MYPROC ProcAdd; 
LibHandle = LoadLibrary(“msvcrt.dll”); 
ProcAdd = (MYPROC) GetProcAddress(LibHandle, "system"); //查找system函数地址 
(ProcAdd) ("command.com");          //其实就是执行system(“command.com”) 
­
return 0; 
这段代码实现上面那段一样的功能,但是语法糖成分少了许多…
PS:这段代码其实是有BUG的,我测试过,压入的数据有问题,不应该是字符串,应该是付给它个正确的地址….
仔细看下,应该发现些许程序执行的原理
­
任何程序代码都是要压入内存的,ASM中是code segment
代码段也是地址啊,所以调用函数,就是call
Call函数的地址而已,这是写把高级语言转换成shellcode的基础
­
­
现在转向要分析的reverse.cpp
先分析出这个文件中调用的所有函数:
­
有这些个函数:
­
­
自然每个函数对应一个地址,明白windows一点原理的应该知道,这些函数的地址是固定的(在各个版本系统内应该是固定的)
我用的是XP SP3,本机VISTA下地址和XP就不一样了,如何做到宇宙通用版的函数地址?这个是shellcode的高级技术,我只听说过,等以后认真学习了汇编再尝试下,呵呵
­
如何找到这些函数的地址呢,我写了个程序:
//address.cpp 
#include<iostream> 
#include<windows.h> 
using namespace std; 
­
typedef void (*MYPROC)(LPWSTR); 
int main() 

         char adrStr[200]; 
         HINSTANCE LibHandle; 
         MYPROC ProcAdd; 
­
    cout<<"                           Function Address Hunter            "<<endl; 
         while(true) 
         { 
                   cout<<"The Dll name:"; 
                   cin>>adrStr; 
                   LibHandle = LoadLibraryA(adrStr); 
                   cout<<LibHandle<<endl<<endl; 
                   cout<<"Function Name:"; 
                   cin>>adrStr; 
­
                   while(strncmp(adrStr,"exit",4) != 0) 
                   { 
                                      ProcAdd = (MYPROC)GetProcAddress(LibHandle,adrStr); 
                                      cout<<ProcAdd<<endl; 
                                      cout<<"Function Name:"; 
                                      cin>>adrStr; 
                   } 
         }         
­
         return 0; 

­
测试报告:
VISTA下的
­
­
XP SP3下的:

­
­
地址还是不一样的哈
对了,这个函数地址查询你要确定函数所在的dll,其实这个还算简单,网上一搜就知道了
说个比较特殊的
Memset这个函数是在ntdll中,比较例外的一个
找到了地址就成功了很多
我们可以把地址压入栈,然后call地址就行了,相当于调用了函数
但是函数的参数怎么得到,这是个问题,而且涉及了很多调试的技巧…
下面虚拟个例子:
假设是Sleep(200)
这个函数,首先分析Sleep在哪个dll
发现实在kernel32中,用上面的程序查找出Sleep的地址:
0x7C802446
参数怎么构造的?
涉及汇编语言了,原理就是读取最近压入 的数据
所以你可以明白为什么函数的参数是从又向左压入栈了….
程序中的
Sleep(200);
现在替换掉:
_asm
{
Push 200
Mov eax, 0x7C802446
Call eax
}
随便找个程序插入测试,完全可以通过,这就是构造参数
其实这中间过程也蛮复杂的,要注意各个寄存器的数值的变化,例如EIP,记录程序执行位置,ESP记录堆栈顶,EAX记录返回值等等
后面我还会用到EBP记录这些地址数据
­
额…
再接再厉,后面还有三篇要写
­
­
--------------by   NewSketcher
Time :   080822  15:55

转载于:https://www.cnblogs.com/ns517/archive/2008/10/04/1303753.html

循环渐进NsDoor(五)相关推荐

  1. 循环渐进NsDoor(三)

    2G的内存,T5450的U,结果匿名管道Sleep(300)都跑不对PeekNamePipe(...);Fuck!Fuck!白测试两天时间啊- 想骂人- 日,好浪费时间- 不过还是怪自己从没做过这种网 ...

  2. 循环渐进NsDoor(七)

    本来这个和上一篇就是连着的,但是上一篇也太长了点 所以在这再开始 //#include<iostream>  #include<winsock2.h>  #pragma com ...

  3. 循环渐进NsDoor(一)

    基本前三节的内容我都思考好了,甚至代码都写好了,甚至我都测试成功了- 但是,这节还是只写windows socket编程的基础内容,为了存点底,然后最近又没时间继续向下想- 这次实现一个socket服 ...

  4. 关于OC取名循环渐进的申明

    语本<论语·宪问>有云:"不怨天,不尤人,下学而上达,知我者其天乎." 宋朱熹集注:"但知下学而自然上达,此但自言其反己自修,循序渐进耳." 明袁宗 ...

  5. Windows循环渐进-Ping程序实现代码

    Windows循环渐进书籍中Ping程序实现代码 #include "stdio.h" #include "iostream.h" #include " ...

  6. android软件开发之webView.addJavascriptInterface循环渐进【二】

    说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/android-software-de ...

  7. OC循环渐进:文件管理--计算文件大小的五种方式

    在文件管理中,计算文件的大小是要经常用到的操作!其核心就是利用NSData中的length方法来计算字节长度. 以下介绍文件中计算大小的五种常见方式: 创建文件的代码如下: NSString *doc ...

  8. python for循环连续输入五个成绩判断等级_Python基础(1)——输入输出/循环/条件判断/基本数据类型...

    一.编程语言 1. 编译型语言:先编译,再执行 (先编译成二进制) 举例:英文书翻译成中文再看 C.C++.C# 2.解释型语言:一边执行一边编译 举例:英文书找个翻译,它翻译一行你听一行 php.j ...

  9. 双重 for 循环-打印五行五列星星,打印n行n列的星星

    1.一行打印五颗星星.. var num = prompt('请输入星星的个数');var str ='';for(var i =1; i<=num; i++){str = str + '★'} ...

最新文章

  1. 如何在Java中编写正确的微基准测试?
  2. linux通过rinetd工具进行端口映射/转发/重定向
  3. 大数据学习之路(七)——学习小结
  4. android启动---lk入口文件crt0.s解析
  5. 线性表应用之线性表算法设计六大经典案例
  6. HDU.5909.Tree Cutting(树形DP FWT/点分治)
  7. (4)计数器systemverilog与VHDL编码
  8. iOS 图片部分模糊,类似于美图秀秀
  9. QT4.8.5 显示中文
  10. Photos_2017 China MVP Community Connection
  11. java在微信的应用_java版微信公众平台消息接口应用示例
  12. python+django+mysql教室实验室预约系统毕业设计毕设开题报告
  13. ens32文件空白(没有ens33文件)
  14. 学习,不仅要知其然,更要知其所以然。
  15. Codeforces1548 D1. Gregor and the Odd Cows (Easy)(皮克公式+gcd+数学推导)
  16. docker run参数-v的rw、ro详解
  17. QIUI囚爱男用APP远程贞操锁2.0 破解不完全指南(附破解工具)
  18. NLP一些常见的专有名词
  19. 02《区块链财富指北》私钥篇(2):百行Python代码演示一私钥生成多公链公钥原理。
  20. Linux:库函数:libc: glibc

热门文章

  1. int bool str (索引,切片) for 循环
  2. java 分权分域什么意思_基于云平台的分权分域系统分析与设计
  3. C语言单片机压力传感器报警器,单片机压力传感器的实时监测和报警程序
  4. Win7系统卸载McAfee杀毒软件
  5. 苹果框架学习(二) Metal
  6. Android加载百度地图
  7. 【深度学习】5:CNN卷积神经网络原理
  8. Google Play图标上传规则调整
  9. 【A-SOUL】嘉然 MMD模型下载
  10. PYTHON PLUS 原神——星辉兑换“宗室武器”的总体暴击率提升度算法