TypechoJoeTheme

霍雅的博客

登录
用户名
密码
/
注册
用户名
邮箱

BUUCTF [BJDCTF 2nd]8086

2025-03-04
/
0 评论
/
21 阅读
/
正在检测是否收录...
03/04

注:本人属于刚学汇编,所以可能会有一些错误
依题意得,题目应该是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))
朗读
赞(0)
版权属于:

霍雅的博客

本文链接:

https://huoya.work/bk/index.php/archives/155/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月