恶意代码 第三章作业2

修改样例代码hello25.exe

一、使其弹出对话框中的内容变为本组学号信息

改错文件了,但是原理是类似的,可以当学习文档学习一下

1.修改文件内容

①修改输出长度

winhex中将1024行的第4个字节修改为0x36,因为要填入的学号有6个,一个需要8字节存储,中间的分隔符5个加上结束符0x00一共54字节(即0x36),(0x3000+0x0036=0x3036),将这个相对于0x3000的偏移注明,0x3000(即文件中的0x800)是文件第一个字符串的起始位置

image-20210411191703384

图1.1.1

②写入数据

PEview这两个数据段相距0x1000,在winhex中相距0x1024,也可以通过观察字符找到位置

image-20210411192517101

图1.1.2

2.输出中文

①打开终端

python
"第二组".encode('GBK')

效果如下:

image-20210411190317747

图1.2.1

②填入数据

B5DAB6FED7E9依次填入数据区即可输出中文

image-20210411192350482

图1.2.2

③检验输出

image-20210411192310478

图1.2.3

二、使其文件中不存在MessageBoxA这一函数名,仍可正常运行

1.寻找函数序号

image-20210411204452725

图2.1.1

2.修改

image-20210411205101386

图2.2.1

其他步骤与三基本一致

三、使其文件中不存在ExitProcess这一函数名,仍可运行

1.寻找修改的位置

image-20210411201944668

图3.1.1

观察导入表的结构,得出要修改的位置位0x650的位置,数据为0x00002064

2.寻找ExitProcess的序号

方法1:在C:\WINDOWS\system32文件夹下找到kernel32.dll,用Stud_PE打开

image-20210411203503428

图3.2.1

183=0xB7

方法2:利用Dependency Walker查看序号

image-20210411204802808

图3.2.2

3.修改引入名字表

image-20210411202655290

图3.3.1

修改为0x800000B7,最高位为1意思是通过序号引入,为0是通过名字引入,0xB7为函数的序号

4.将函数名修改为全0验证

image-20210411203902268

图3.4.1

程序正常运行

四、使其只弹出第一个对话框

1.在OllDbg中查看

0x00000014+0x0040102C=0x00401040,即MessageBoxA函数,这是就会弹出第二个弹窗,现在我们要改变这个指向,使其指向0x00401034ExitProcess函数,这时就会直接退出(方法1),或者把调用MessageBoxA的部分直接用空指令填充,使其直接执行ExitProcess(方法2)

image-20210411212127457

图4.1.1

2.修改

方法1:修改JMP的地址

image-20210411211524329

图4.2.1

方法2:填充NOP

image-20210411213316180

图4.2.2

3.验证

image-20210411213854184

图4.3.1

五、使其只弹出第二个对话框

1.在OllDbg中查看

由图可知,第二个对话框的首条指令在0x00401016,因此就可以修改可选文件头中的首条指令地址,使其指向第二个对话框(方法1),或者在把第一个对话框的内容全部填充为NOP(方法2)

image-20210411210110726

图5.1.1

2.修改

方法1:修改首条命令地址

image-20210411205920853

图5.2.1

方法2:填充NOP

image-20210412084850040

图5.2.2

3.测试

image-20210411205947935

图5.3.1

六、问题与解决

1.如何修改参数字符串的长度

①在OllDbg中调试程序

image-20210411193627589

图6.1.1

0x401002在文件中对应0x4020x401007对应文件中的0x4070x40300B0x403000都是对应位置存储的数据

②在PEview中打开查看

image-20210411194147885

图6.1.2

0x403000对应文件中的位置是0x800

③转到0x800

image-20210411195035779

图6.1.3

2.特殊字符的写法

利用python求出对应的16进制

先打开cmd

python
hex(ord('\t'))
hex(ord('\n'))

输出如下:

image-20210411195744464

图6.2.1

3.加快输入中文字符

如果中文字符不长的话可以对照python按照上文的方法逐个输入,但是如果比较长,就会很累且容易出错,因此我写了一个python文件可以将字符格式化一下:

word = input('please input : ')
word_gbk = word.encode('GBK')
word_gbk_str = str(word_gbk)[2:len(str(word_gbk))-1]
work_gbk_str_hex = word_gbk_str.replace(r'\x','').upper()
print(work_gbk_str_hex)

效果如下:

image-20210411200209870

图6.3.1

可以直接复制,写入文件,会快一点,还有一个方法就是通过一些网站在线转:赵工的个人空间,感觉一般

4.16进制代码的位置

image-20210411214335665

图6.4.1

在文件中的0x400的位置,也是存储text节(代码节)的位置

5.关于data大小的问题

image-20210411215001502

图6.5.1

0x0000000E=14字节,正好对应helloworld hi和两个终止符正好14字节,但是我发现再向后加几个字母一样可以输出,不会报错。

posted @ 2021-04-12 09:19  20181204王浩博  阅读(387)  评论(0编辑  收藏  举报