Stage 222222 —— 逆向工程拆除“二进制炸弹”程序

简介

一、文件

Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第1张图片
bomb.c:代码框架,bomb主程序即main函数,没有细节。
bomb: bomb的可执行程序。linux下的可执行程序,需要0或1个命令行参数。

二、bomb.c文件

Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第2张图片
L34’'
FILE *infile; --------------- 变量:“从外部文件输入到终端”

L35’'
argc,argv 用命令行编译程序时有用。
主函数main中变量(int argc,char *argv[ ])的含义
argc: 整数,用来统计运行程序时送给main函数的命令行参数的个数
argv[ ]: 指针数组,用来存放指向字符串参数的指针,每一个元素指向一个参数
即:argv 的元素个数是argc,存放指向每一个参数的指针
argv[0] 指向程序运行的全路径名(包括路径 eg:“F:/VC/Ex1/Debug/Ex1.exe”)
argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串

argv[argc]为NULL。

L43’'
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第3张图片
大致看懂了。

三、工具:objdump命令

objdump命令是Linux下的反汇编目标文件或者可执行文件的命令
实例:
1)显示文件头信息
objdump -f test
2)显示Section Header信息
objdump -h test
3)显示全部Header信息
objdump -x test
4)显示全部Header信息,并显示对应的十六进制文件代码
objdump -s test
5)输出目标文件的符号表
objdump -t obj
6)输出目标文件的所有段概述
objdump -h obj
7)反汇编test中的需要执行指令的那些section
objdump -d test
8)反汇编test中的所有section
objdump -D test
9)反汇编出源码(指定section)
objdump -Slj .text obj
10)对任意二进制文件进行反汇编
objdump -D -b binary -m i386 a.bin
11)将bomb的汇编代码写入asm.txt中:
objdump –d bomb > asm.txt
【更多:】
https://www.aliyun.com/jiaocheng/104464.html
https://blog.csdn.net/beyondioi/article/details/7796414
(哈哈哈哈哈。

四、工具:gdb调试器

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能:
启动程序,可以按照工程师自定义的要求随心所欲的运行程序。
让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。
当程序被停住时,可以检查此时程序中所发生的事,并追索上文。
动态地改变程序的执行环境

实例:
注1:需要调试的程序在编译的时候要加 -g 选项,程序才能进行调试
注2:以下所有命令都可以简写首字母,例:info break ==> i b 除特殊声明外

#gdb program // 进入调试模式
#list file.c:fanction // 显示file.c文件中的fanction函数
#break file.c:fanction // 在file.c文件中的fanction函数处打一个断点
#break file.c:100 // 在file.c文件中的第100行打一个断点
#info break // 查看所有断点
#delete break num // 删除断点号为 num 的断点
#run // 开始运行程序
#bt // 显示程序的栈
#watch expr // 监视 expr 变量,(每次运行到变量处就会打印变量的值)(watch 不能简写)
#print expr // 打印处 expr 变量的值,(当前运行函数中的变量)
#c // 继续运行程序
#next // 单步运行
#quit // 退出调试
https://blog.csdn.net/yvhqbat/article/details/51393313
https://www.cnblogs.com/mingcaoyouxin/p/4225619.html

拆炸弹

一、Phase1:字符串比较

Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第4张图片
read_line(); ------输入一个字符串,如果正确,这个phase的bomb就会被解除。

操作 一.1

-都10月27号了kali可以拖拽文件了吗?
-不能
虚拟机中登录xxx,下载该压缩文件
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第5张图片
从tar中提取bomb文件,在终端中打开,执行objdump -d命令,把汇编代码写入txt文件
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第6张图片

操作 一.2

Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第7张图片

x86汇编程序基础(AT&T语法)

sub/add $0x8 , %rsp

堆栈指针rsp的地址减去8,程序入栈;加上8,程序出栈

movl $1, %eax

这是一条数据传送指令,CPU内部产生一个数字1, 然后传送到eax寄存器中。mov后边的l表示long,说明是32位的传送指令。CPU内部产生的数称为立即数,在汇编程序中立即数前面加"$",寄存器前面加"%",以便跟符号名区分开

【x86汇编的两种语法:intel语法和AT&T语法
mov %edx,%eax 这条指令如果用intel语法来写,就是 mov eax,edx,寄存器名不加 % 号,并且源操作数和目标操作数的位置互换。】

start_loop:
cmpl $0, %eax
je loop_exit

循环。
比较eax的值是不是0,如果是0就要跳出循环。
cmpl指令将两个操作数相减,但计算结果并不保存,只是根据计算结果改变eflags寄存器中的标志位。
如果两个操作数相等,则计算结果为0,eflags中的ZF位置1。
je是一个条件跳转指令,它检查eflags中的ZF位,ZF位为1则发生跳转,ZF位为0则不跳转继续执行下一条指令。
je的e就表示equal。

----------------------------------

几个通用寄存器:
%eax
%ebx
%ecx
%edx
%edi
%esi
另外几个用于特殊目的的寄存器:

%ebp
%esp
%eip
%eflags

----------------------------------

在调用一个函数之前,首先将所有参数以相反的声明顺序入栈,之后再调用call指令
call主要做两件事:1、它将下一条指令的地址入栈 2、将%eip设置为函数的初始地址

以上phase1:
1)进入GDB调试
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第8张图片

应该是-q进入GDB调试
2)在esp寄存器对应地址处 设置断点
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第9张图片
3)run一下
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第10张图片
4)查看字符串
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第11张图片
关于x命令:https://www.cnblogs.com/liuyimin/p/7274184.html
5)拆弹
试了一次一直爆炸,可能是之前设置了一个断点?
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第12张图片

shell命令退出了之后重新进来run就成功了!
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第13张图片
终于知道咋拆弹了。。。

一、Phase2:循环

Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第14张图片
在这里插入图片描述
根据上一炸弹的经验,
Stage 222222 —— 逆向工程拆除“二进制炸弹”程序_第15张图片
汇编太难了!!!
以下是一些分析过程

你可能感兴趣的:(IT)