Hack The Planet

๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค, cyalume์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

reverse engineering

[Anti-Reversing] Anti Disassembly ๊ตฌํ˜„

cyalume 2022. 8. 15. 18:25

์š”์•ฝ: VS์˜ __asm{} ๋‚ด๋ถ€์— _emit์œผ๋กœ 0xE9/0xE8๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด, ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ์˜ ์ •์ƒ์ ์ธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ•ด์„์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Œ

anti disassembly๋ž€?
๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํŒŒ์ผ์„ ์ฝ๊ณ  ๊ทธ ํ๋ฆ„์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ธฐ์ˆ .
์‹ค์ œ ์‹คํ–‰๊ณผ๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ์†์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์›๋ฆฌ
๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ์˜ ๊ฐ€์ •๊ณผ ์ œ์•ฝ์„ ์ด์šฉํ•˜์—ฌ, ์œ ํšจํ•œ ๋ช…๋ น์„ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ๋ถ€ํ„ฐ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค
๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ํฌ๊ฒŒ ์„ ํ˜• ์ค‘์‹ฌ/ํ๋ฆ„ ์ค‘์‹ฌ์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ์„ ํ˜• ์ค‘์‹ฌ์˜ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” opcode๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฒˆ์—ญํ•˜๊ณ , ํ๋ฆ„ ์ค‘์‹ฌ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ๋ถ„๊ธฐ๋ฌธ์— ์œ ์˜ํ•˜๋ฉฐ opcode๋ฅผ ๋ฒˆ์—ญํ•œ๋‹ค.

ํ”ํžˆ๋“ค ์‚ฌ์šฉํ•˜๋Š” IDA์˜ ๊ฒฝ์šฐ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ๋ฆ„ ์ค‘์‹ฌ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋กœ, JZ/JNZ ๋“ฑ ์กฐ๊ฑด๋ถ€ ์ ํ”„๊ฐ€ ์ˆ˜ํ–‰๋  ๋•Œ false branch (์กฐ๊ฑด์— ๋งž์ง€ ์•Š์„ ๋•Œ์˜ ์ฝ”๋“œ)์— ์ดˆ์ ์„ ๋งž์ถฐ ๋””์Šค์–ด์…ˆ๋ธ”์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ ์„ ์—ญ์œผ๋กœ ์ด์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ์•ˆํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ” ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด,

xor eax, eax
jz label1
mov eax, 1

label1:

์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.
eax๋ฅผ 0์œผ๋กœ ๋งŒ๋“  ๋’ค ZF๊ฐ€ ์„ธํŒ…๋˜์–ด label1๋กœ ์ ํ”„ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์ธ๋ฐ, ํ•œ ๋ˆˆ์— ๋ด๋„ mov eax, 1์ด๋ผ๋Š” ๋ช…๋ น์–ด๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ํ๋ฆ„ ์ค‘์‹ฌ์˜ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” jz์˜ false branch์ธ mov eax, 1 ์ฝ”๋“œ์— ์ดˆ์ ์„ ๋งž์ถฐ ๋””์Šค์–ด์…ˆ๋ธ”์„ ์ง„ํ–‰ํ•œ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” opcode๋ฅผ ๋จผ์ € ํ•ด์„ํ•ด ๋ฒ„๋ฆฐ ๊ฒƒ์œผ๋กœ, ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ด ์กฐ๊ฑด ๋ถ„๊ธฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” false branch ์˜์—ญ์— 0xE9 (jmp) / 0xE8 (call) ๋“ฑ์˜ opcode๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ๋””์Šค์–ด์…ˆ๋ธ” ๊ณผ์ •์— ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ ์‰ฝ์ฃ ?

์˜ˆ์ œ ์ฝ”๋“œ
1. JZ + JNZ ๋™์ผํ•œ ์ฃผ์†Œ
๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ํ•œ ๋ฒˆ์— ํ•œ ๋ช…๋ น๋งŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฐ์†๋œ JZ์™€ JNZ ๋ช…๋ น์˜ operand๊ฐ€ ๋™์ผํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌ์ผœ๋„ ์ด๋ฅผ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. (์•„๋‹์ˆ˜๋„... ๋‚ด๊ฐ€ ๊ฐํžˆ ํ‹€๋ ธ์„์ˆ˜๋„)

#include <stdio.h>
//compiler: visual studio 2019, x86 debug

int main(void){
    __asm{
        jz label1
        jnz label1
        _emit 0xE9 //0xE9 == JMP, 0xE8 == CALL
    }
 
    label1:
        printf("Successfully executed!\n");
    
    return 0;
}

ํ•„์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” x32dbg์˜ ๊ฒฝ์šฐ, ํ”„๋กœ๊ทธ๋žจ์— ์‚ฝ์ž…๋œ 0xE9๋ผ๋Š” ๋ฐ์ดํ„ฐ ๋•Œ๋ฌธ์— ๋””์Šค์–ด์…ˆ๋ธ”์„ ์›ํ™œํžˆ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ , ๋””๋ฒ„๊ฑฐ๋ฅผ ๋ถ™์—ฌ ์‹คํ–‰ ์‹œ ๋””๋ฒ„๊น…์ด ์ค‘์ง€๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

2. XOR [arg], [arg] -> JZ [mem]
๋˜‘๊ฐ™์€ operand๋ฅผ xor ํ–ˆ์œผ๋ฏ€๋กœ ZF๊ฐ€ ์„ธํŒ…, ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ JZ๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š” false branch์— ์ค‘์ ์„ ๋‘์–ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— JZ false branch์˜ ๋ฐ์ดํ„ฐ, 0xE9๋‚˜ 0xE8์ด opcode๋กœ ํ•ด์„๋˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ด ์˜์—ญ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ ํ•ด์„์ด ๋ฐ€๋ฆฐ๋‹ค.

#include <stdio.h>

int main(void){
    __asm{
        xor eax, eax
        jz label1
        _emit 0xE9
    }
    
label1:
    printf("Successfully executed!\n");
   
    return 0;
}

๋‹น์—ฐํ•œ ์†Œ๋ฆฌ์ง€๋งŒ _emit 0xE9 ๋’ค์˜ "Successfully executed!\n" ๋ฌธ์ž์—ด๋„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋‹ค.

๋ถ„์„ ๋ฐฉ๋ฒ•
๊ธฐ๋ณธ์ ์œผ๋กœ IDA๋Š” anti disassemble ๊ธฐ๋ฒ•์ด ์ ์šฉ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์˜์—ญ์„ ๋นจ๊ฐ›๊ฒŒ ํ•˜์ด๋ผ์ดํŒ… ํ•ด ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  Hex view ์ฐฝ์—์„œ anti disassemble์„ ์œ„ํ•ด ์‚ฝ์ž…๋œ ํ—ฅ์Šค ๊ฐ’์„ 0x90 (==nop)์œผ๋กœ ํŒจ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ์œ„์˜ ์˜ˆ์‹œ์— ๊ทผ๊ฑฐํ•˜์—ฌ (jnz+jz / xor+jz) ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์ด ๋ง๊ฐ€์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๊ณ , ๊ทธ ๋ถ€๋ถ„์„ 0x90์œผ๋กœ ํŒจ์น˜ํ•˜๋ฉด ๋œ๋‹ค.

์›๋ฆฌ๋„ ์–ด๋ ต์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ•˜๋งˆํ„ฐ๋ฉด ๋ถ„์„๊ฐ€๋ฅผ ์†์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ์ˆ ์ž„์€ ํ‹€๋ฆผ์—†์–ด ๋ณด์ธ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐ€์ •์„ ํ™œ์šฉํ•ด ์ด๋Ÿฐ ๊ธฐ์ˆ ์„ ๋งŒ๋“ค์–ด ๋ƒˆ๋‹ค๋Š” ์ ์ด ํฅ๋ฏธ๋กญ๋‹ค.