181008 逆向-inctf(load3r、Decoy)

load3r

题目提示可知bin文件为bootloader
将其用IDA打开,选择16-bit模式加载,即可看到反汇编出的程序

由于IDA不支持16-bit的F5,所以只能读汇编
不过由于bootloader对长度有限制,必须为512字节以内,因此相对不是很复杂
多提一句,按空格可以转为graph模式,这个状态下可以看到代码块之间的跳转关系,非常方便

seg000:000B                 mov     si, 16h
seg000:000E                 call    sub_11B

为例分析,双击sub_11B进去看这个函数

int x是系统提供的中断API,这个函数中IDA对int 10H进行了提示:
WRITE CHARACTER AND ADVANCE CURSOR
即写出字符,其中AL寄存器保存字符,BH和BL表示颜色和坐标等高级选项,可以不用关心
而AL的赋值来自于lodsb,百度它可以发现这条汇编指令的作用是将si寄存器指向的地址处的值送到AL中,然后si寄存器自增。
而si寄存器在call之前进行了赋值,即0x16h处的字符串"'ENTER THE FLAG"

int 10h之后是jmp回函数开头,因此这是一个循环
而循环的终止条件就在于cmp al, 0和jz 0x1d3两条指令,
它们表示当AL为0时跳转到0x1d3处

那么到这里就可以判断出sub_11B这个函数就是用来打印字符串的,我们将光标移动到它上,按"n"可以重命名,从而方便以后的观察

继续往后分析,在sub_128中,int 16h来接收输入

seg000:012E                 int     16h             ; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
seg000:012E                                         ; Return: AH = scan code, AL = character
seg000:0130                 mov     ds:6Dh, al
seg000:0133                 mov     [bx+6Fh], al
seg000:0137                 cmp     byte ptr ds:6Dh, 0Dh
seg000:013C                 jz      short loc_147

调用完后al存储字符的ASCII,后面将它放入ds:6D和[bx+6Fh]中,再与0D比较,相等则跳转
对照ASCII表可知,0x0d是回车键,也就是说直到输入回车表示结束

不跳转的情况下也是一个循环,会对bx自增,而调用之前可知bx的初值为0(在0x5处的指令mov bx, 0)&#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值