Exercise: Helloworld
1. ์ ์ ๋ถ์
IDA๋ก ํ์ผ ์ด๊ธฐ
main ํจ์ ์ฐพ๊ธฐ
์ ์ ๋ถ์์ ์ฃผ๋ก main ํจ์๋ฅผ ์ฐพ๊ณ , ์ด๋ฅผ ๋ถ์ํ๋ฉฐ ์์๋๋ค.
๋ฐ์ด๋๋ฆฌ์์ ์ด๋ค ํจ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
- ํ๋ก๊ทธ๋จ์ ์์ ์ง์ ์ธ ์ง์
์ (Entry Point, EP)๋ถํฐ ๋ถ์์ ์์ํด์ ์ํ๋ ํจ์๋ฅผ ์ฐพ์ ๋๊น์ง ํ์
- ์ด ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ์ ๊ท๋ชจ๊ฐ ์กฐ๊ธ๋ง ์ปค์ ธ๋ ๋ถ์์ ์์๋๋ ์๊ฐ์ด ๊ธ์ฆ
- ๋์ ํจ์์ ํน์ฑ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ์ธ์ ์ธ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ํ์
๋ฌธ์์ด ๊ฒ์ ๐
๋ฌธ์์ด๋ค์ ํน์ฑ์ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ๋๊ฐ ๋ง๋ค.
ex) ํ๋ก๊ทธ๋จ์ ๋ก๊ทธ์ ๊ด๋ จ๋ ๋ฌธ์์ด์ ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ํจ์์ ์ด๋ฆ๊ณผ ์ธ์๊ฐ ์ ํ์๊ธฐ๋ ํ๋ค.
IDA๋ ๋ฐ์ด๋๋ฆฌ์ ํฌํจ๋ ๋ฌธ์์ด์ ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก "๋ฌธ์์ด ํ์" ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค.


- Shift + F12๋ฅผ ๋๋ฆ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ด๋๋ฆฌ์ ํฌํจ๋ ๋ฌธ์์ด์ด ์ด๊ฑฐ๋ Strings ์ฐฝ์ด ๋ํ๋ฉ๋๋ค.
- ๋ง์ ๋ฌธ์์ด ์ค์ 'Hello, world!'๋ผ๋ ๋ฌธ์์ด์ด ๋ณด์ ๋๋ค. ์ปดํ์ผ ๊ณผ์ ์์ ๋ค์ํ ๋ฌธ์์ด์ด ๋ฐ์ด๋๋ฆฌ์ ์ถ๊ฐ๋๋๋ฐ, ์ด ๋ฌธ์์ด์ ๊ทธ๋ฐ ์ข ๋ฅ๊ฐ ์๋๋ผ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฃ์์ ๊ฒ์ผ๋ก ์ถ์ธกํ ์ ์์ต๋๋ค.
- ์ด ๋ฌธ์์ด์ ๋๋ธ ํด๋ฆญํ์ฌ ๋ฐ๋ผ๊ฐ๋๋ค.
์ํธ ์ฐธ์กฐ ๐
์ ์ ๋ถ์์ ํ๋ค๊ฐ, ์ด๋ค ์์ํ ๊ฐ์ด๋ ํจ์๋ฅผ ์ฐพ์์ ๋ ์ํธ ์ฐธ์กฐ(Cross Reference, XRef)๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ์ฐธ์กฐํ๋ ํจ์๋ฅผ ๋ถ์ํ ์ ์๋ค.
์์์ ์ฐพ์ "Hello, world!\n"์ด๋ผ๋ ์์ํ ๋ฌธ์์ด์ด ์ด๋์ ์ฌ์ฉ๋๋์ง ์ถ์ ํด๋ณด์.
"aHelloWorld"๋ฅผ ํด๋ฆญํ๊ณ ์ํธ ์ฐธ์กฐ์ ๋จ์ถํค X๋ฅผ ๋๋ฅด๋ฉด Figure2์ ๊ฐ์ด xrefs(cross reference) ์ฐฝ์ด ๋ํ๋๋ค.
์ด ์ฐฝ์๋ ํด๋น ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋ชจ๋ ๋ณ์๊ฐ ์ถ๋ ฅ๋๋ค.


main ํจ์ ๋ถ์
mainํจ์๋ฅผ ์ฐพ์์ผ๋ฏ๋ก, F5๋ฅผ ๋๋ฌ์ ์ด๋ฅผ ๋์ปดํ์ผ ํด๋ณด์.

๋์ปดํ์ผ๋ ์ฝ๋๋ฅผ ํตํด ํจ์์ ์ฃผ์ ์ ๋ณด๋ฅผ ์ดํด๋ณด์!
์ธ์ ๋ถ์
IDA๋ argc, argv, envp๋ก 3๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค.
๋์
1. Sleep ํจ์๋ฅผ ํธ์ถํ์ฌ 1์ด ๋๊ธฐํ๋ค.
2. qword_14001DBE0์ "Hello, world!\n" ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ๋ฃ๋๋ค.
3. sub_140001060์ "Hello, world!\n" ๋ฅผ ์ธ์๋ก ์ ๋ฌํ์ฌ ํธ์ถํ๋ค.
4. 0์ ๋ฐํํ๋ค.
๋ฐํ ๊ฐ
0์ ๋ฐํํ๋ค.
ํด์ฆ



sub_14001060 ํจ์ ๋ถ์

- va_start ํจ์๋ฅผ ํตํด ๊ฐ๋ณ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์์์ ์ ์ ์๋ค.
- __arct_job_func ํจ์๋ ์คํธ๋ฆผ์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉ๋๋ ํจ์
- ์ธ์ง๋ก ๋ค์ด๊ฐ๋ 1์ stdout์ ์๋ฏธํ๋ค.
- ๋ฐ๋ผ์ ๋ฌธ์์ด ์ธ์๋ฅผ ๋ฐ๊ณ stdout ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฐ๋ณ ํจ์์์ ์ ์ ์๋ค.
- ์ด ๋ชจ๋ ์ ํฉ์ ํตํด sub_14001060ํจ์๋ printf ํจ์๋ก ์ถ์ ํ ์ ์๋ค.
* ์คํธ๋ฆผ?
์คํธ๋ฆผ(Stream)์ ๋ฐ์ดํฐ๊ฐ ์กฐ๊ธ์ฉ ํ๋ฌ๋ค์ด์จ๋ค๋ ์๋ฏธ์์ ๋ช ๋ช ๋์๋ค.
๋ฐ์ดํฐ๋ ์คํธ๋ฆผ์ ํ์์ผ๋ก ํ ํ๋ก์ธ์ค์์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก, ๋๋ ํ ํ๋ก์ธ์ค์์ ๋ค๋ฅธ ํ์ผ ๋ฑ์ผ๋ก ์ด๋ํ๋ค.
์ด์์ฒด์ ๋ stdin (standard input), stdout (standard output), stderr (standard error)์ ๊ฐ์ ๊ธฐ๋ณธ ์คํธ๋ฆผ๋ค์ ํ๋ก์ธ์ค๋ง๋ค ์์ฑํด์ค๋ค. ์ด๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ํ๋ก์ธ์ค๋ฅผ ์ฐ๊ฒฐํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
printํจ์๋ stdout์ ํตํด ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํด์ฃผ๋ฉฐ,
scanfํจ์๋ ํค๋ณด๋ ์ ๋ ฅ์ stdin์ผ๋ก ๋ฐ์์ ํ๋ก์ธ์ค์ ์ ๋ฌํด์ค๋ค.
์ด๋ฐ ๊ธฐ๋ณธ ์คํธ๋ฆผ์ธ์, ํ๋ก๊ทธ๋๋จธ๋ ํ์์ ๋ฐ๋ผ ์คํธ๋ฆผ์ ์์ฑํ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด, ํ๋ก๊ทธ๋๋จธ๊ฐ dream.txt๋ผ๋ ํ ์คํธ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด, ์ด ํ์ผ๊ณผ ์คํธ๋ฆผ์ ํ์ฑํ์ฌ ๋ด์ฉ์ ์์ฑํ ์๋ ์๋ค.
2. ๋์ ๋ถ์
main ํจ์ ์ง์
์ค๋จ์ ์ค์ (Break Point, F2) ๋ฐ ์คํ(Run, F9)
โก Run(F9) : ํ๋ก๊ทธ๋จ์ ๊ณ์ ์คํ, ๋๋ ๋๋ฒ๊น ์ ์์ํ๋ค.
์ค๋จ์ ์ ํน์ ์ฃผ์์ ์ค์ ํ๊ณ , ์คํ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๋จ์ ๊น์ง ๋ฉ์ถ์ง ์๊ณ ์คํ๋๋ค.
mainํจ์์ ๋์์ด ๊ถ๊ธํ๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ์ด์ฉํด์ mainํจ์๋ก ์ง์ ํ๋๋ก ํ๊ฒ ๋ค.


ํ ๋จ๊ณ ์คํ (Step Over, F8)
Step Over(F8)์ ๊ด์ฌ์ด ์๋ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์ ๋ฐํ๊ฒ ๋ถ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๋ค.
F8์ ๋๋ฅด๋ฉฐ ํ๋ก๊ทธ๋จ์ ๋์์ ๋ถ์ํ ์ ์๋ค.
โก Step Over(F8): ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ํ ์ค ์คํํ๋ค. ํจ์ ๋ด๋ถ๋ก๋ ๋ค์ด๊ฐ์ง ์๋๋ค.
- sub rsp, 38์ ํตํด main ํจ์๊ฐ ์ฌ์ฉํ ์คํ ์์ญ์ ํ๋ณดํ๋ค.
- rsp+0x20์ 4 ๋ฐ์ดํธ ๊ฐ์ธ 0x000003e8์ ์ ์ฅํ๋ค.
- rsp+0x20์ ์ ์ฅ๋ ๊ฐ์ ecx์ ์ฎ๊ธด๋ค. (ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ์ค์ )
- Sleepํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ecx๊ฐ 0x3e8์ด๋ฏ๋ก, Sleep(1000)์ด ์คํ๋์ด 1์ด๊ฐ ์คํ์ด ๋ฉ์ถ๋ค.
- “Hello, world!\n” ๋ฌธ์์ด์ ์ฃผ์๋ฅผ rax์ ์ฎ๊ธด๋ค.
- ์๋์ ๋ฉ๋ชจ๋ฆฌ ๋คํ ์ฐฝ์ ์ด์ฉํ์ฌ 0x14001a140์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด ์ค์ ๋ก ํด๋น ๋ฌธ์์ด์ด ์ ์ฅ๋์ด ์์์ ํ์ธํ ์ ์๋ค.
- rax์ ๊ฐ์ data์ธ๊ทธ๋จผํธ์ ์ฃผ์์ธ 0x14001dbe0์ ์ ์ฅํ๋ค.
- 0x14001dbe0์ ์ ์ฅ๋ ๊ฐ์ rcx์ ์ฎ๊น๋๋ค. ์ด๋ ๋ค์ ํธ์ถํ ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
- 0x140001060ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ ์ ๋ถ์์ ํตํด ์ด ํจ์๋ฅผ printfํจ์๋ผ๊ณ ์ถ์ธกํ๋ค.
- ํ๋ก๊ทธ๋จ์ ํ์ธํ๋ฉด, Hello, world!๊ฐ ์ถ๋ ฅ๋์ด ์๋ค. ์ ์ ๋ถ์์ ํ ๋๋ ํจ์์ ๊ธฐ๋ฅ์ ์ถ์ธกํ๊ธฐ ์ด๋ ค์ ์ง๋ง, ๋์ ๋ถ์์ผ๋ก๋ ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ ํจ์๋ผ๋ ์ฌ์ค์ ์ฝ๊ฒ ์ ์ ์๋ค.
- ์์ํ ๋ ํ์ฅํ ์คํ ์์ญ์ add rsp, 38์ ํตํด ๋ค์ ์ถ์ํ๊ณ , ret์ผ๋ก ์๋ ์คํ ํ๋ฆ์ผ๋ก ๋์๊ฐ๋ค.

ํจ์ ๋ด๋ถ๋ก ์ง์ ํ๊ธฐ (Step Into, F7)
Step Over๋ ํจ์์ ๋ด๋ถ๋ก ์ง์ ํ์ง ์๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ค ํจ์๋ฅผ ๋ถ์ํ๋ค ๋ณด๋ฉด ๊ทธ ํจ์๊ฐ ํธ์ถํ๋ ๋ค๋ฅธ ํจ์๊น์ง ์ ๋ฐํ๊ฒ ๋ถ์ํด์ผ ํ ๋๊ฐ ์๋ค.
๋ง์ ๋๋ฒ๊ฑฐ๋ ๊ทธ๋ฐ ์ํฉ์ ๋๋นํ์ฌ Step Into(F7)๋ผ๋ ๊ธฐ๋ฅ์ ์ง์ํ๊ณ ์๋ค.
โก Step Into(F7): ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ํ ์ค ์คํํ๋ค. ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ๋ค.
์ด๋ฒ printf()์ ์ค๋จ์ ์ ์ค์ ํ๊ณ , ํด๋น ํจ์์ ๋ด๋ถ๋ก ์ง์ ํด๋ณด์.



- ๋๋ฒ๊น ์ ์ค๋จ(Ctrl-F2)ํ๊ณ , printf๋ฅผ ํธ์ถํ๋ 0x14000110b์ ์ค๋จ์ ์ ์ค์ ํฉ๋๋ค.
- ๋๋ฒ๊น ์ ๋ค์ ์์ํ๊ณ , Continue(F9)๋ฅผ ํด๋ฆญํ์ฌ, printf ํจ์์ ๋๋ฌํฉ๋๋ค.
- F7 ๋จ์ถํค๋ฅผ ํตํด ํจ์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ๋๋ค. ํจ์ ๋ด๋ถ๋ก RIP๊ฐ ์ด๋ํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Appendix, ์คํ ์ค์ธ ํ๋ก์ธ์ค ์กฐ์ํ๊ธฐ
IDA๋ฅผ ์ด์ฉํ๋ฉด ์คํ ์ค์ธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ํ ์ ์๋ค.
Sleep Forever
๊ธฐ์กด ์ฝ๋์์๋ Sleep(delay=1000)์ ํธ์ถํ์ฌ 1์ด ๋์ ํ๋ก์ธ์ค๋ฅผ ์ ์ง์ํจ๋ค.
์ด๋ฒ์๋ delay์ ๊ฐ์ 1000000์ผ๋ก ์กฐ์ํ์ฌ 1000์ด ๋์ ํ๋ก์ธ์ค๋ฅผ ์ ์ง์์ผ๋ณด๊ณ ์ ํ๋ค.




- delay๋ฅผ Sleepํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ ๋ถ๋ถ์ ์ค๋จ์ ์ ์ค์ ํ๊ณ , ํ๋ก์ธ์ค๋ฅผ ์ฌ์์ํ๋ค.
- ์คํ์ ๋ณด๋ฉด rsp+0x20์ delay์ ๊ฐ์ธ 0x3e8์ด ์ ์ฅ๋์ด ์๋ค.
- ํด๋น ๊ฐ์ ํด๋ฆญํ๊ณ , F2๋ฅผ ๋๋ฅธ ๋ค 0xf4240(=1000000)์ ์ ๋ ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ F2๋ฅผ ๋๋ฌ์ ๊ฐ์ ์ ์ฅํ๋ค. delay์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ด์ F9๋ฅผ ๋๋ฌ์ Sleepํจ์๋ฅผ ํธ์ถํ๋ค. ์๊น์ ๋ฌ๋ฆฌ ํ์ฐธ์ ๊ธฐ๋ค๋ ค๋ ํ๋ก์ธ์ค๊ฐ ์ฌ๊ฐ๋์ง ์์ต๋๋ค. 1000์ด๋ ๋๋ต 20๋ถ์ด๋ฏ๋ก, 20๋ถ ์ ๋๋ฅผ ๋๊ธฐํด์ผ ํ๋ก์ธ์ค๊ฐ ์ฌ๊ฐ๋๋ค.