easyyasm
这题是一个没有壳的16位汇编逆向
直接用ida分析
seg003:0000 public start
seg003:0000 start proc near
seg003:0000 mov ax, seg dseg
seg003:0003 mov ds, ax
seg003:0005 assume ds:dseg
seg003:0005 mov ax, seg seg001 //seg001 move ax 这里的是比较数据
seg003:0008 mov es, ax //ax move es
seg003:000A assume es:seg001 // 伪指令
seg003:000A mov si, 0 // set si 0
seg003:000D
seg003:000D loc_100DD: ; CODE XREF: start+38↓j
seg003:000D cmp si, 1Ch //compare si 1Ch to 28 (大抵是循环28次)
seg003:0010 jz short loc_10135 //判断跳转right
seg003:0012 xor ax, ax // 归零
seg003:0014 mov al, [si]
seg003:0016 shl al, 1 // al是 ax的低八位,此处左移4位(1个hex)
seg003:0018 shl al, 1
seg003:001A shl al, 1
seg003:001C shl al, 1
seg003:001E push ax // ax入栈
seg003:001F xor ax, ax // 归零
seg003:0021 mov al, [si]
seg003:0023 shr al, 1 // ax右移1hex
seg003:0025 shr al, 1
seg003:0027 shr al, 1
seg003:0029 shr al, 1
seg003:002B pop bx // bx出栈
seg003:002C add ax, bx // ax加bx 约等于按位或
seg003:002E xor ax, 17h // ax 异或 0x17
seg003:0031 add si, 1 // si 加 1
seg003:0034 cmp al, es:[si-1] // es compare 也就是和data比较
seg003:0038 jz short loc_100DD // 判断跳转worng或者重复循环
分析完写脚本
data=[0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21, 0x14, 0xC1,
0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1, 0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0]
flag=''
for i in data:
i ^= 0x17
a = (i << 4) & 0xff # 取低八位
b = (i >> 4)
i = a | b
flag+= chr(i)
print(flag)
结束