刚学汇编,第一次自己写博客,分享一下,人艰不拆哈~
老师为了提高我们的学习兴趣,给了我们这些刚懂寄存器是什么的菜鸟一个简单的exe文件让我们进行反汇编破解出正确的中断输入
也不懂什么反汇编工具,仅在dosbox下用debug.exe文件的u命令进行破解
听说高手都是在dos窗口下进行反汇编的,呵呵,其实是我们老师给的题目一下子就可以反汇编出语句来了,这篇博客只是用来记录一下分析过程
不废话了,上文件SECRET1.exe
debug命令 | 意义 |
---|---|
u | 查看debug反汇编过来的代码 |
t | 单步执行 |
d | 查看内存内容 |
p | 跳过代码段执行,用来跳过中断 |
debug后r命令显示寄存器内容,u命令查看当前代码段代码
将查看到底命令手动敲到自己用的编辑器上,配合分析,我在用的是Notepad++
然后用t命令执行一下到ds使用
用一下d命令通过ds寄存器看看数据段上的内容
然后就只能一步一步的调试,一步一步的改进之前抄在记事本里的反汇编出来的代码了
做标记,搞清楚逻辑关系,寻找突破口
这时候一个好的代码格式会帮很大的忙的
反汇编出来的汇编语言代码.asm文件:
data segment
db 0Ah,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h, 00h,00h,00h,00h,00h,00h;我不知道有没有其他方法来设置代码段的前几位,只能用这种笨办法了
key db 'you are welcome',0dh,0ah,'$'
warning db 'error!Please input again!',0dh,0ah,'$'
data ends
code segment
assume cs:code
start:
mov ax,data
mov ds,ax
mov es,ax
mov bx,0000
input_again:
mov dx,0000
mov ah,0Ah;输入中断
int 21h
lea si,ds:[0002];指向输入的字符首地址,正确密码应该为zpv!bsf!x(前连续任意几位均可)
lea di,ds:[0016]; you are welcome!
mov cl,ds:[0001];输入字符个数计数
next:
mov al,ds:[di]
inc al
cmp ds:[si],al;判断密钥是否匹配,若不匹配则跳到error_
jnz error_
inc si
inc di
dec cl
jnz next ;一位匹配则跳入下一位的匹配
lea dx,ds:[0016];破解成功,获得输出结果
mov ah,09h;输出中断
int 21h
jmp quit
nop
error_:
lea dx,ds:[0029]
mov ah,09h;输出error
int 21h
inc bx;控制尝试次数,达到3次则自动结束程序
cmp bx,+03
jnz input_again
quit:
mov ah,4ch;windows 结束
int 21h
code ends
end start
最重要的是静下心来,一步一步地操作,学习代码最快的捷径就是敲程序,然后发现问题并解决它