霍雅
追求源于热爱,极致源于梦想!
注:本人属于刚学汇编,所以可能会有一些错误
依题意得,题目应该是8086架构,所以只能是看
exeinfo PE 显示8bit
打开ida 选择8086架构
从左侧看,只有sub_10030和start函数,流程图也没什么意义,可能ida识别不是太好
通过shift+12查看字符串,有一个常量
以下为完整汇编代码
dseg:0000 ;
dseg:0000 ; +-------------------------------------------------------------------------+
dseg:0000 ; | This file was generated by The Interactive Disassembler (IDA) |
dseg:0000 ; | Copyright (c) 2023 Hex-Rays, <support@hex-rays.com> |
dseg:0000 ; +-------------------------------------------------------------------------+
dseg:0000 ;
dseg:0000 ; Input SHA256 : 5B7DDACB9E68E51E17DF183D7D82532CDE8CA8B08C4F380563F04B55937F3BF3
dseg:0000 ; Input MD5 : 3401209C51461D5A0C7D1E184C83CDD8
dseg:0000 ; Input CRC32 : D638CAC9
dseg:0000
dseg:0000 ; File Name : C:\Users\administered\Downloads\reverse-8086_ASM-DreamerJack.exe
dseg:0000 ; Format : MS-DOS executable (EXE)
dseg:0000 ; Base Address: 1000h Range: 10000h-10056h Loaded length: 56h
dseg:0000 ; Entry Point : 1003:1A
dseg:0000
dseg:0000 .8086
dseg:0000 .model large
dseg:0000
dseg:0000 ; ===========================================================================
dseg:0000
dseg:0000 ; Segment type: Pure data
dseg:0000 dseg segment para stack 'DATA'
dseg:0000 assume cs:dseg
dseg:0000 aUDuTZWjQGjzZWz db ']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;',0
dseg:0000 ; DATA XREF: seg001:0005↓o
dseg:0000 ; seg001:0011↓o
dseg:0023 align 10h
dseg:0023 dseg ends
dseg:0023
seg001:0000 ; ===========================================================================
seg001:0000
seg001:0000 ; Segment type: Pure code
seg001:0000 seg001 segment byte public 'CODE'
seg001:0000 assume cs:seg001
seg001:0000 assume es:nothing, ss:nothing, ds:dseg
seg001:0000
seg001:0000 ; =============== S U B R O U T I N E =======================================
seg001:0000
seg001:0000 ; Attributes: noreturn
seg001:0000
seg001:0000 sub_10030 proc near ; CODE XREF: sub_10030↓j
seg001:0000 ; start+5↓p
seg001:0000 jmp short sub_10030
seg001:0000 sub_10030 endp
seg001:0000
seg001:0002 ; ---------------------------------------------------------------------------
seg001:0002 mov cx, 22h ; '"'
seg001:0005 lea bx, aUDuTZWjQGjzZWz ; "]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;"
seg001:0009
seg001:0009 loc_10039: ; CODE XREF: seg001:000F↓j
seg001:0009 mov di, cx
seg001:000B dec di
seg001:000C xor byte ptr [bx+di], 1Fh
seg001:000F loop loc_10039
seg001:0011 lea dx, aUDuTZWjQGjzZWz ; "]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;"
seg001:0015 mov ah, 9
seg001:0017 int 21h ; DOS - PRINT STRING
seg001:0017 ; DS:DX -> string terminated by "$"
seg001:0019 retn
seg001:001A assume ss:dseg, ds:nothing
seg001:001A
seg001:001A ; =============== S U B R O U T I N E =======================================
seg001:001A
seg001:001A ; Attributes: noreturn
seg001:001A
seg001:001A public start
seg001:001A start proc near
seg001:001A mov ax, seg dseg
seg001:001D mov ds, ax
seg001:001F assume ds:dseg
seg001:001F call sub_10030
seg001:001F start endp
seg001:001F
seg001:0022 ; ---------------------------------------------------------------------------
seg001:0022 mov ah, 4Ch
seg001:0024 int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
seg001:0024 seg001 ends ; AL = exit code
seg001:0024
seg001:0024
seg001:0024 end start
通过对汇编的分析,sub_10030函数
这个函数中间没有任何的其他命令,只有一个jmp sub_10030,也就是jmp会他本身,这个函数没有任何意义,也就是死循环函数
往下看,有个
mov cx,22h
把cx的数值变成22h 转换为10进制就是34
lea bx,aUDuTZWjQGjzZWz
把aud这个字符串加载到bx
mov di,cx
移动cx到di
dec di
dec是自减
到了关键的地方了,xor byte ptr [bx+di],1Fh
xor是异或的意思
byte ptr [bx+di]可以看成是c编程中的bx[di]这种形式,但是是小端序
所以转成大端序也就是
for (int i = 0; i < 34; i++) {
dx[i] ^= 0x1F;
}
所以再异或回去也就是flag
exp: BJD{jack_de_hu1b1an_xuede_henHa0}
encrypted_str = "]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;"
print( ''.join(chr(ord(c) ^ 0x1F) for c in encrypted_str))