嗯,俺就是来水经验的。。。
今天中午编写一个shellcode调试了好久,终于发现是我的一个函数里面使用了好几个寄存器但是没有保存,导致调用这个函数的地方执行混乱,最后找到问题,解决之后感觉好清爽。
俺是个小菜鸟,今天谈谈我是怎样写汇编还有编译调试的。
以前在xp时代,电脑里面还自带一个debug,win7没有了,不过感觉windbg就像是debug的进化版本,那个时候学汇编还可以开一个cmd窗口就直接写程序啦,现在不行了。大家现在是用什么写代码呢?masm?nasm?
俺在上个学期的时候用的是masm,要先写一大堆.386啊,include啊,includelib啊,
,还要用什么API啊,简直让人感觉就在水下,要窒息啊。后来学习漏洞发掘利用,要写shellcode,发现了nasm这个汇编器,俺觉得这才是写汇编啊,就像是鸟儿在天上飞似的。
扯了这么多的淡,肯定有人要扔鸡蛋。俺说说怎么用nasm来写程序。
nasm里面写的语句都是纯汇编(intel格式的,比AT_T好写,虽然AT_T格式写出来更能展示出牛逼之处)。我们怎么让它运行呢,毕竟你要让它在windows下面跑,还要让它变成PE格式(windows下面的可执行程序必须遵循的格式)的啊,虽然nasm的输出格式里面有个win32格式,但是生成的是obj格式,俺试过指定outputfile为.exe格式,你会发现一点有趣的东西哟。俺发现俺真是个大水逼,写了这么多什么都没说。。。
好,下面我们开始写程序啦。
我们创建一个asm文件,既然要展示汇编的牛逼之处,当然不能右键->新建了,我们点开始,输入cmd打开一个cmd窗口,进入一个文件夹(cd命令),进入文件夹后输入echo test>my.asm,你到那个文件夹下面就可以看见一个名字为my,格式为asm的文件了。如果是在linux环境下,我们可以直接就在终端(也就是那个cmd窗口,linux下面叫终端)用vim编辑我们的汇编程序了。那我们怎么写程序呢?用来写程序的叫编辑器,windows下面的记事本也是一个编辑器,不过用记事本写程序很痛苦,因为没有语法高亮,就是那些特殊的字符串它不会自动给你改变颜色让你看得更清楚,阅读更轻松,我用过的编辑器里边notepad++是不错的,我现在也用它,你可以在这里找到
http://notepad-plus-plus.org/。下载安装好,我们就可以用它来编辑我们的程序了。现在我们打开前面的my.asm,在最开始写上[BITS 32],这是给待会的nasm编译器看的。很好,我们开始写代码了。下一行写上 xor eax,eax.如果你看不懂没关系,图书馆随便借一本汇编教材就可以的。我们保存好文件。
我们去下载nasm:
http://sourceforge.net/projects/nasm/,下载回来安装好。貌似安装好后会自动加入路径的,也就是我们在cmd窗口是可以直接使用这个程序的。不过记不太清了,反正后面也许用的着,我先说说怎么将一个文件夹加入路径。计算机(win7)/我的电脑(xp)->右键->属性->高级(xp)/高级系统设置(win7),也许不太好找,左右上下仔细看看,点到高级之后有个环境变量那个按钮,点下去,出来一个窗口,上面是用户变量,下面是系统变量。就直接修改系统变量吧,在变量那一栏里找到Path(路径的意思),点击编辑,Path这个变量每个路径之间是用分号间隔的,所以我们到最后,先确定那里有个分号,没有的话自己添上去,然后将你安装nasm的那个文件夹的路径复制到这里,比如c:\Program Files\nasm.这样就可以在命令行窗口直接使用nasm命令了。
我们新开一个cmd窗口,来到刚刚我们那个asm程序的文件夹(还记得怎么进入另外的文件夹吗?cd命令,有的时候需要cd /d Path 哟)来我们输入下面这个命令:
nasm -f bin -o my my.asm
nasm的帮助文档可以用nasm -h查看,输出格式帮助可以用nasm -hf查看。
这样我们就得到一个文件名叫my的二进制文件,这是个真的二进制文件,里面是我们每条汇编语句的opcode码(当你学习汇编,学着学着就知道什么是opcode码了,到时候你一定要记得有人告诉过你这个东东哟)。这个二进制文件可不是能执行的,也就是不能当程序来运行的。
嗯,我们还需要一个工具,小二,上盘perl脚本。
脚本语言是比较简单的一种语言,它一般就像命令一样,一条一条执行。我比较喜欢perl这个脚本语言,很简单,大家现在不要觉得好多东西要学啊,什么nasm汇编,什么perl脚本,别管他,这些都是工具,你不需要学习工具,工具只是拿来用的。
大家到这里下载perl:
http://strawberryperl.com/,这个工具里面还集成了gcc,另外一个很好用的工具,linux下面大家都用它的。
下载安装好,大家可以先试试开一个cmd窗口输入perl -v 试试,如果有一些英文输出的话,perl已经将自己加入Path了。如果提示你这不是一个什么内部命令,外部命令啥的,你还得按照前面的步骤将perl手动加入Path(我记得好像是安装会自动加入的)。下面附件有一个perl脚本,我在这个网站上面找到的:https://www.corelan.be/,这个网站上面有很多很好的文章,大家可以去看看,大家一定要学好英文,很多外国人的文章写的非常好,到底世界上用英文的多。
下载好这个perl脚本(pvereadbin.txt),先放到你的那个asm程序所在的文件夹,然后开cmd窗口进入文件夹,输入下面这个命令:move pvereadbin.txt pvereadbin.pl(论坛不允许上传perl格式的文件。。。)
下面再输入一个命令:perl pvereadbin.pl my,perl程序执行脚本就是这个样子,先是perl,然后是脚本名称,最后是脚本可能需要的参数,这个pvereadbin.pl 需要一个文件名作为参数。
是不是显示了一些东西出来呢?有一个双引号扩起来的字符串,我们要提取出来。你一定在骂我:cmd窗口怎么提取的出来,根本就不能选定嘛。不要着急。你将鼠标移动到窗口的最上面,就是跟标题栏平行的那里,点右键,选属性,出来一个窗口,你在这里面找找,是不是有一个快速编辑模式几个字,前面还有一个框框,我们把那个框框选了。点确定。回到cmd窗口了,你用鼠标左键到处划一下试试,学会了把,但是点右键没有出现什么复制粘贴之类的啊,其实在你点右键的时候,你用左键选择的东西就已经复制好了。很好,你又get了一个新技能,可以去微博上炫耀一下。
下面我们再来复制一点东西:
#include <windows.h>
char code[]=
int main(int argc, char **argv)
{
LoadLibrary("user32.dll");
LoadLibrary("ws2_32.dll");
WORD version=MAKEWORD(2,2);
WSADATA wsa;
int err=WSAStartup(version,&wsa);
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
大家无视上面的代码,就像你平时看见一把椅子一样,这只是用来提供我们的代码可以坐的地方。
还记得怎么创建一个文件吗?echo ilikeyahang>shellcodetest.c
这样你就创建了一个名为shellcode的c文件,当然那个ilikeyahang只是我随手写的,大家用前面的notepad++打开这个c文件,删掉里面的ilikeyahang,把上面的代码复制进去,保存好。
看见那个char code[]=了吗?我们把前面那个perl pvereadbin.pl my输出的用双引号括起来的内容连同双引号和后面的分号复制(还记得怎么复制把?)下来,贴到char code=的后面。在cmd窗口输入gcc -o shellcodetest shellcodetest.c -lws2_32,是不是在文件夹下多了一个shellcodetest.exe的文件呢?大家可以双击这个文件,也可以在cmd窗口下输入shellcodetest.exe来执行这么文件。大家一定又在骂人,怎么出来一个错误弹窗!
嗯,我们要涉及到调试器了,有人喜欢ollydbg,有人喜欢windbg,各有千秋把。
论坛有提供ollydbg和windbg下载的,大家下载安装。这个论坛里很多前辈已经谈过无数次了,我要是再来谈,实在有点罗嗦。
很好,我假设大家安装好了ollydbg,我们如何用ollydbg来调试我们的程序呢,特别是我想调试的是我自己写的那段汇编代码,而不是前面那个什么C程序。
我们在写汇编的时候,在[BITS 32]下面一行,写上db 0xcc,这样,当我们用ollydbg打开我们的程序之后,按F9运行,程序就会停在我们的那个db 0xcc那里,你会看到一个 int 3指令,这个指令大家先不用管,学着学着就知道了。int 3后面就是你写的汇编代码啦。你就可以按什么F8,F7,F4之类的快捷键调试啦,大家可以在ollydbg调试(英文版debug)那个菜单那里看到这些常用的快捷键。
俺都觉得俺好啰嗦,,,本来以为半个小时写好,居然写了接近两个小时。
其实用masm没什么不好,但是俺始终觉得用masm感觉更像是在用C写似的,用nasm纯汇编才有汇编的赶脚,自己找kernel32.dll的位置,然后自己找到导出表,想要其他的dl就搜索导出表找到LoadLibraryA来加载,要用什么函数自己去找而不是用vs给你提供的一大堆难记的API(虽然最后还是要用这东东),而且写shellcode的时候nasm可是好用多了。今天本来是完成了一个shellcode觉得清爽了来水水经验,没想到经验这么难水。。。在网页上直接编辑也有些不方便。大家随意看。写下来只是安慰安慰和我一样的小菜鸟,其实还有很多人和你一样挣扎在菜鸟的边缘,大家不要放弃,入门了就可以好好努力了。
要去上课了,最后说一下,文章没有什么技术性的话题,只是带领大家进入汇编的世界,如果有什么不懂的或是系统环境和我的不一样,大家一定不要忘了google这个老师!
大家是怎么学习汇编的,欢迎分享给我这样的小菜鸟。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课