๋ฆฌ๋ฒ์ฑ - go ์ธ์ด .exe ํ์ผ main ํจ์ ๋ฐ print ํจ์ ์ฐพ๊ธฐ
main ํจ์ ์ฐพ์ ๋ฐฉ๋ฒ
IDA์์ ํจ์ ๋ชฉ๋ก์ ๋ณด๋๊น main_main์ด ๊ทธ๋๋ก ๋ ธ์ถ๋์ด ์์์
(x64dbg์๋ ida์ฒ๋ผ ์๋ธ๋ฃจํด์ ๋ฆฌ์คํธํํ๋ ๊ธฐ๋ฅ์ด ์์์ผ๋ฉด ์ข๊ฒ ๋ค.. )
x64dbg์์๋ ํจ์๋ค์ ์ฐพ๊ธฐ ์ด๋ ค์ ๋๋ฐ ์ฝ๋๋ฅผ ํ์คํ์ค์ฉ ์ฒ์ฒํ ์คํ์ ํ๋ฉด ์ค๋ ๋ ๋ฌธ์ ์ธ์ง ์๊พธ ์์ธ ์ค๋ฅ๊ฐ ๋ฌ๋ค..
(์ฐพ์๋ณด๋๊น SEH: Structured Exception Handling๋ผ๋ ๊ฒ ๊ฐ๋ค. ์ฃผ๋ก ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ๋ฐ์)
Exception 0x80000004 0x0 0x0 0x623c1d
PC=0x623c1d
runtime.mstart0()
C:/Program Files/Go/src/runtime/proc.go:1553 +0x5d fp=0x74521ffb38 sp=0x74521ffb10 pc=0x623c1d
runtime.mstart()
C:/Program Files/Go/src/runtime/asm_amd64.s:394 +0x5 fp=0x74521ffb40 sp=0x74521ffb38 pc=0x6446a5
goroutine 1 [running]:
goroutine running on other thread; stack unavailable
goroutine 2 [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
C:/Program Files/Go/src/runtime/proc.go:398 +0xce fp=0xc000043fa8 sp=0xc000043f88 pc=0x62162e
Test
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:404
runtime.forcegchelper()
C:/Program Files/Go/src/runtime/proc.go:322 +0xb8 fp=0xc000043fe0 sp=0xc000043fa8 pc=0x6214b8
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1650 +0x1 fp=0xc000043fe8 sp=0xc000043fe0 pc=0x646741
created by runtime.init.6 in goroutine 1
C:/Program Files/Go/src/runtime/proc.go:310 +0x1a
goroutine 3 [GC sweep wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
C:/Program Files/Go/src/runtime/proc.go:398 +0xce fp=0xc000045f78 sp=0xc000045f58 pc=0x62162e
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:404
runtime.bgsweep(0x0?)
C:/Program Files/Go/src/runtime/mgcsweep.go:280 +0x94 fp=0xc000045fc8 sp=0xc000045f78 pc=0x60d1f4
runtime.gcenable.func1()
C:/Program Files/Go/src/runtime/mgc.go:200 +0x25 fp=0xc000045fe0 sp=0xc000045fc8 pc=0x602585
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1650 +0x1 fp=0xc000045fe8 sp=0xc000045fe0 pc=0x646741
created by runtime.gcenable in goroutine 1
C:/Program Files/Go/src/runtime/mgc.go:200 +0x66
goroutine 4 [GC scavenge wait]:
runtime.gopark(0xc000018070?, 0x672118?, 0x1?, 0x0?, 0xc000040b60?)
C:/Program Files/Go/src/runtime/proc.go:398 +0xce fp=0xc000055f70 sp=0xc000055f50 pc=0x62162e
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:404
runtime.(*scavengerState).park(0x6bf7c0)
C:/Program Files/Go/src/runtime/mgcscavenge.go:425 +0x49 fp=0xc000055fa0 sp=0xc000055f70 pc=0x60aac9
runtime.bgscavenge(0x0?)
C:/Program Files/Go/src/runtime/mgcscavenge.go:653 +0x3c fp=0xc000055fc8 sp=0xc000055fa0 pc=0x60b05c
runtime.gcenable.func2()
C:/Program Files/Go/src/runtime/mgc.go:201 +0x25 fp=0xc000055fe0 sp=0xc000055fc8 pc=0x602525
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1650 +0x1 fp=0xc000055fe8 sp=0xc000055fe0 pc=0x646741
created by runtime.gcenable in goroutine 1
C:/Program Files/Go/src/runtime/mgc.go:201 +0xa5
rax 0x74521f0ee0
rbx 0x0
rcx 0xc000040d00
rdi 0xc00004cc58
rsi 0x0
rbp 0x74521ffb28
rsp 0x74521ffb10
r8 0xc00004cc00
r9 0x648160
r10 0x0
r11 0x0
r12 0x0
r13 0x0
r14 0xc000040d00
r15 0x0
rip 0x623c1d
rflags 0x202
cs 0x33
fs 0x53
gs 0x2b
์์ธ๋ฅผ ๋ฐ์์ํฌ ๊ฒฝ์ฐ์๋ ์ด๋ ๊ฒ ntdll.dll๋ฅผ ๋ถ๋ฌ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ค.
์๋ฌดํผ ida๋ก main ํจ์ ์ฃผ์(.text:000000000064BBE0)๋ฅผ ์ฐพ์์ x64dbg๋ก ์ด๋ํ ๋ค์ ๋ ์ด๋ธ์ ์ถ๊ฐํด ์ฃผ์๋ค.
๋ ์ด๋ธ์ ์ถ๊ฐํ๋ฉด call test.654330๋ฅผ call <test.main ํจ์> ์ฒ๋ผ ๋ถ์ํ๊ธฐ ํธํ๋๋ก ๋ฐ๊ฟ ์ ์๋ค.
print ํจ์ ์ฐพ๊ธฐ ๋ฐ ์ถ๋ ฅ ๋ฌธ์ ๋ณ๊ฒฝ
์ด์ main ํจ์๋ฅผ ์ฐพ์๋ค๋ฉด print ํจ์๋ฅผ ์ฐพ๋ ๊ฑด ์์ ์ฃฝ ๋จน๊ธฐ๋ค.
print๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ ์๋ ๋ช ๊ฐ์ง ์ธ์๋ค์ ์ ๋ฌํ๋ค.
์ฒซ ๋ฒ์งธ๋ ๋ฌธ์ ๋ฐ์ดํฐ(Test\n), ๋ ๋ฒ์งธ๋ ๋ฌธ์์ ํฌ๊ธฐ(5)
๋ฌธ์๋ฅผ "Hello Reversing!\n"์ผ๋ก ๋ฐ๊พธ๋ฉด ์๋์ฒ๋ผ ๋ณ๊ฒฝ์ ํ๋ค.
ํฌ๊ธฐ๋ 0x11(17)๋ก ๋ฐ๊พธ๊ณ ๋ฌธ์ ๋์๋ 0x0A(\n)์ ์ฝ์ ํ๋ค.
๋ค์ ์ฝ๋๋ฅผ ์คํ์ํค๋ ๊ฐ์ด ์ ๋๋ก ๋ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฅ ๋์ ๋น ๊ณต๊ฐ(Null Padding)์ ์์์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๊ณ ํด๋น ์ฃผ์๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ผ๋ก๋ ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.