์ปดํ์ผ๋ฌ/๋งํน/ELF๋ฑ๋ฑ ๋ด์ฉ์ ํ๋ฆ์ ํ์ํ ๋ด์ฉ๋ง ๊ฐ๋ตํ๊ฒ ์ ์ ์์ .
์ฐธ๊ณ ์์ ๋ฐ ๋ด์ฉ : ์ปดํ์ผ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋ค๋ ค์ฃผ๋ C์ด์ผ๊ธฐ, []
๊ทธ๋ฆฌ๊ณ , ํด๋น ํ์ผ๋ค์ ์ปดํ์ผ๋ฌ๋ก ํ์ฌ ์คํ ํ์ผ์ ๋ง๋ค์ด ๋ผ๊ฒ์ด๋ค.
์ปดํ์ผ๋ฌ๋ ~~์ ์งํฉ๋๋ค.
1.1 ์ ์ฒ๋ฆฌ๊ธฐ
- .cํ์ผ์ #include๊ฐ ๊ฐ ํค๋์ ๋ด์ฉ๋ค๋ก ์นํ๋๋ค.
- .cํ์ผ์ ๋งคํฌ๋ก๋ฅผ #define์ ๋๋ฒ์งธ ์ธ์๋ก ์นํํ๋ค.
์ด์ธ์ #undef, #ifdef, #error, #pragma, #lineโฆ๋ฑ๋ฑ์ ์ฒ๋ฆฌํ .iํ์ผ์ ์์ฑํ๋ค.
1.2 ์ปดํ์ผ
์ปดํ์ผ๋ฌ๋ .iํ์ผ์ ํด์ํ์ฌ ๊ณ ์์ค์ ์ธ์ด๋ฅผ ์ ์์ค์ ์ธ์ด(์ด์ ๋ธ๋ฆฌ)๋ก ๋ณํํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๊ธด๊ฒ์ด .sํ์ผ์ด๋ฉฐ, ์ฌ์ฉ์ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ์์ค ์ธ์ด ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๋ฏ๋ก ์๋ก๋ค๋ฅธ ์ด์์ฒด๊ฒ๊ฐ์ ํธํ๋์ง ์๋๋ค.
๊ณ ์์ค์ ์ธ์ด๋ฅผ ์ ์์ค์ ์ธ์ด๋ก ํด์ํ๋ ๋์ค ๋ฐ์ํ๋๊ฒ ์ปดํ์ผ ์ค๋ฅ์ด๋ฉฐ, ์ฝ๋์ ๋ฌธ๋ฒ์์ ๋ฌธ์ ์ด๋ค.
1.3 ์ด์ ๋ธ
์ด์ ๋ธ๋ฌ๊ฐ ์ด์ ๋ธ๋ฆฌ์ด์ธ .sํ์ผ์ ํด์ํ์ฌ ๊ธฐ๊ณ์ด(๋ฐ์ด๋๋ฆฌํ์ผ))๋ก ๋ณํํ๋ค. ์ด๋ ์๊ธด๊ฒ์ด ์ค๋ธ์ ํธํ์ผ(.o, .obj)์ด๋ค.
์ค๋ธ์ ํธํ์ผ ๋ฐ ์คํํ์ผ(์ถ๊ฐ๋ก DDL)๋ฑ์ ์ ๋์ค/๋ฆฌ๋ ์ค์์๋ ELFํ์ผ์ด๋ผ๊ณ ํ๋ฉฐ, ์๋์ฐ์์๋ PEํ์ผ์ด๋ผ๊ณ ํ๋ค. ํนํ ์ค๋ธ์ ํธ ํ์ผ์ ์๋์ฐ์์๋ PEํ์์ .obj, ๋ฆฌ๋ ์ค/์ ๋์ค์์๋ ELFํ์์ .o์ด ์์ฑ๋๋ค.
๋๋ต์ ์ธ ํํ๋ ์๋ ๋งํน ์ด๋ฏธ์ง์ ํ์. ์ค๋ธ์ ํธ ํ์ผ ๊น๋ดค๋๋ฐโฆ .obj๋ ์ ๋ณด๋ ์ ๊ณ , ๋ญ๊ฐ ๊ตฌ์กฐ๋ ๋ฌ๋ผ์ ๊ทธ๋ฅ ๋์ด๊ฐ๋๊ฒ ์ข์๋ฏ ํ๋ค. ๋ฆฌ๋ฒ์ฑ ๊ณต๋ถํ๋๊ฑฐ ์๋๊ณ ์ ์ ๋ชจ๋ฅด๊ฒ ์โฆ
์ฐ๋ฆฌ์๊ฒ ํ์ํ๊ฑด ์ค๋ธ์ ํธ ํ์ผ์ด PEํ์์ด๋ฉฐ, ๋ณ์ ๋ฐ ํจ์๊ฐ ๊ฐ ๊ธฐ๋ฅ๋ณ ์น์ ์ผ๋ก ๋๋์ด์ ธ ์๋ค๋ ๊ฒ์ด๋ค.
https://redthing.tistory.com/entry/PE-%ED%8C%8C%EC%9D%BC%EC%9D%98-%EA%B5%AC%EC%A1%B0
1.4 ๋งํน ๋ฐ ์คํํ์ผ
๊ฐ ๋ณ์ ๋ฐ ํจ์๊ฐ ์น์ (.bss, .data, ๋ฑ์ ๋ฐ๋ผ ๊ตฌ๋ถ)๋์ด ์๊ณ , ๋งํน๋ ํ์ํ ๋ถ๋ถ๋ง ์์ ์ฑ๊ฒจ์ ์คํํ์ผ์ ํฉ์น๋ค.
1.5 PEํ์ผ
PEํ์ผ์ ๋ทฐ์ด๋ก ์ด์ด์ ํ์ธํ ์ด๋ฏธ์ง. ์ถ๋ ฅ์ ์ํด ์ฝ๋์ ๊ธฐ์ ํ ๋ฌธ์์ด์ด .rdata์์ญ์ ์ ์ฅ๋์ด ์๋ค.
PEํ์ผ์ ํค๋์ ๋ฐ๋๋ก ๊ตฌ๋ถ๋์ด ์๊ณ , ๋ฐ๋๋ ์น์ ์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
- ํค๋ : ๊ฐ ์น์ ์ ํฌ๊ธฐ, ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
- ์น์
: ์ค์ง์ ์ธ ๋ฐ์ดํฐ์ ์คํ์ฝ๋๊ฐ ํฌํจ๋๋ ์์ญ.
- .text :ํ๋ก๊ทธ๋จ์ ์คํ์ฝ๋ ํฌํจํ๋ ์น์ . IAT์ ๋ณด๋ ํฌํจ
- .data : ์ ์ญ๋ณ์, static๋ณ์ ํ ๋น์ ์ํด ์กด์ฌํ๋ ์น์
.
- .bss : ์ด๊ธฐํ ๋์ง ์์ ์ ์ญ๋ณ์๋ฅผ ๋ด๋ ์น์ . ๋ณดํต .data ์น์ ์ ๋ณํฉ๋จ.
- .rdata : ๋ฌธ์์ด, ์์ ๋ฑ ์ฝ๊ธฐ์ ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์น์ . ๊ฐ์ํจ์ ํ ์ด๋ธ(vtable)๋ .rdata์ ํฌํจ๋๋ค(์์น ๊ณ์ฐ์ ์ฌ๊ธฐ ์ฐธ๊ณ ).
- .rsrc : ๋ฆฌ์์ค ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ ์น์
- .idata : Importํ DLL์ ๊ด๋ จ API๋ค์ ์ ๋ณด๋ฅผ ๋ด๋ ์น์
- .edata : EXPORTํ API๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ์น์ .
2. ๋ฉ๋ชจ๋ฆฌ ๋ก๋ฉ
์ผ์ชฝ์ด PEํฌ๋ฉง. PEํ์ผ์ ์์ธํ ๋ด๋ถ ๊ตฌ์กฐ๋ ํด๋น ๋ธ๋ก๊ทธ์ฐธ์กฐ.
PEํ์ผ์ด ๋ก๋๋ ๋, VMM์ ํ์ด์งํ์ผ์ ์ฌ์ฉํ์ง ์๊ณ , PEํ์ผ ์์ฒด๋ฅผ ํ์ด์งํ์ผ์ฒ๋ผ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๊ทธ๋๋ก ๋งคํ ์ฐธ๊ณ
ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ฆฌ๋๊ฒ์ ๋ก๋๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ๋ก๋์ ์ํด ์ํ๋๋ค. ๋ก๋๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ์ํํ๋ค๊ณ ํ๋ค.
- ํ์ผ์ ์ ๋ณด๋ฅผ ์ฝ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํ
- ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ์ฌํญ์ ๊ณ์ฐ ๋ฐ ํ๋ก์ธ์ค ์ค์
- ํ๋ก๊ทธ๋จ ์คํ์ ์ํ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ(ํ๋ก์ธ์ค๋น ํ ๋น๋)ํ ๋น
- ๋ณด์กฐ ์ ์ฅ์ฅ์น์์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฃผ์๊ณต๊ฐ์ ๋ณต์ฌํ๋ค.
- ์คํํ์ผ์ .text ๋ฐ .data์น์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ค.
์์ ์์๋ฅผ ๋ณด๋ฉด PE์ ์น์ ์ ๊ฑฐ์ ๊ทธ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ฆฌ๋๊ฑธ ์ ์ ์๋ค. ์ฌ์ค PE๋ ๊ธฐ๊ณ์ด๋ก ๋์ด์์ผ๋ฏ๋ก, ์ด ์์ฒด๊ฐ ์ปดํจํฐ๊ฐ ์ดํดํ๋ ๋์ ๋ช ๋ น์ธ ๊ฒ์ด๋ค.
๋๋ถ๋ถ ๊ทธ๋๋ก ์ฌ๋ผ๊ฐ์ง๋ง, NULL์ ๊ฒฝ์ฐ NULL padding์ ํ์ฌ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ค(ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋จ์๋ก ๋ง๋ฆ).
3. ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ.
์์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ๊ฐ PEํ์ผ(ํ๋ก๊ทธ๋จ)์ ํ๋ก์ธ์ค์ ํ ๋นํ ๊ณต๊ฐ์ค .text, .data(.bssํฌํจ) ์์ญ์ด ๋๋ค.
์คํ์ ์์์ ์ธ ๊ณต๊ฐ์ผ๋ก,
- ํ๋ก๊ทธ๋จ ์ธ์(ac, av, envโฆ)๋ฅผ ์คํ์ ๋ณต์ฌํ๋ค.
- esp๋ ์ง์คํฐ๊ฐ ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์ ์คํ์ ๊ฐ์ฅ ์(์์๋ถ)๋ฅผ ๊ฐ๋ฅดํค๋๋ก ํ๋ค.
- ์์๋ฃจํด(mian())์ผ๋ก ์ ํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋์ํ๊ธฐ ์์ํ๋ค.
- .text : ์ฝ๋๊ฐ ์ ์ฅ๋ ์์ญ. .code์์ญ์ด๋ผ๊ณ ๋ ํ๋ค. ์์ฑํ ์ฝ๋(ํจ์, ํด๋์ค, ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ๋ฑ)์ด ์ด ์์ญ์ ๋ค์ด๊ฐ๋ค.
- .data : ์ ์ญ, ์ ์ ๋ณ์๋ค์ด ์ ์ฅ๋ ์์ญ์ด๋ค.
- .data : ์ด๊ธฐํ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- .bss : ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- ์ง์ญ๋ณ์๋ ์คํ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.
- heap : ๋์ ์ผ๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ. ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น/ํด์ ํ๋ syscall์ ์ํด ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌํ๋ค. ๋ํ ๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ค ๋ํ heap์์ญ์ ์ต์๋จ์ ํ ๋น๋๋คโฆ?
- stack : ํธ์ถ๋ ํจ์ ๋ฐ ์ง์ญ๋ณ์๋ stack์ push๋๊ณ , return์ pop๋๋ค. ์ฌ๊ทํจ์๊ฐ ๋๋์ง ์์ผ๋ฉด stackoverflow๊ฐ ๋ฐ์.
heap์ฃผ์๋ ์ฆ๊ฐํ๊ณ , stack์ฃผ์๋ ๊ฐ์ํ๊ฒ ์ค์ ํ์ฌ, stack์ด๋ heap์ด overflowํด๋ ์ค์ ๋ฐ์ดํฐ๋ ์นจ๋ฒํ์ง ์๊ฒ ์ค๊ณ๊ฐ ๋์ด์๋ค.
2 virtual๊ณผ vtable
์ฐ์ ๊ฐ๋ฐ์๊ฐ ์๋์ ๊ฐ์ ํ์ผ๋ค์ ์์ฑํ๊ณ , ์ปดํ์ผ์ ํ๋ค.
[Base.hpp]
class Base
{
public:
int a;
Base() :a(42) {}
virtual void listen();
void speak();
};
[Base.cpp]
#include <iostream>
#include "Base.h"
void Base::listen()
{
std::cout << "Base listen" << std::endl;
}
void Base::speak()
{
std::cout << "Base speak" << std::endl;
}
[Derived.hpp]
class Derived : public Base
{
public:
int b;
Derived() :b(43) { a = 41; }
virtual void listen() override;
void speak();
};
[Derived.cpp]
#include <iostream>
#include "Derived.h"
void Derived::listen()
{
std::cout << "Derived listen" << std::endl;
}
void Derived::speak()
{
std::cout << "Derived speak" << std::endl;
}
[main.cpp]
#include <iostream>
#include "Base.h"
#include "Derived.h"
int main()
{
Base base;
Derived derived;
Base* basePtr = new Base();
Derived* derivedPtr = new Derived();
Base* derivedPoly = new Derived();
//std::cout << << std::endl;
std::cout << "base.a :" << base.a << std::endl;
base.listen();
base.speak();
std::cout << "-----------------------------------" << std::endl;
std::cout << "derived.a :" << derived.a << std::endl;
std::cout << "derived.b :" << derived.b << std::endl;
derived.listen();
derived.speak();
std::cout << "-----------------------------------" << std::endl;
std::cout << "basePtr->a :" << basePtr->a << std::endl;
basePtr->listen();
basePtr->speak();
std::cout << "-----------------------------------" << std::endl;
std::cout << "derivedPtr->a :" << derivedPtr->a << std::endl;
std::cout << "derivedPtr->b :" << derivedPtr->b << std::endl;
derivedPtr->listen();
derivedPtr->speak();
std::cout << "-----------------------------------" << std::endl;
std::cout << "basePtr->a :" << derivedPoly->a << std::endl;
// dynamic_cast -> ๋์ ๋ ๊ฒฐ์ ๋จ.
std::cout << "dynamic_cast<Derived*>(basePtr)->a :" << dynamic_cast<Derived*>(derivedPoly)->a << std::endl;
std::cout << "dynamic_cast<Derived*>(basePtr)->b :" << dynamic_cast<Derived*>(derivedPoly)->b << std::endl;
derivedPoly->listen();
derivedPoly->speak();
std::cout << "dynamic_cast<Derived*>(basePtr)->listen() :";
dynamic_cast<Derived*>(derivedPoly)->listen();
std::cout << "dynamic_cast<Derived*>(basePtr)->speak() :";
dynamic_cast<Derived*>(derivedPoly)->speak();
}
code์์ญ์ vtable ์๋ค. ๊ฐ ํด๋์ค๋ง๋ค ํ๋์ฉ ํ ๋น๋๋ฉฐ ๊ทธ ์์น๋โฆ
๊ฐ virtual์ด ์๋ ์ธ์คํด์ค์ ์์ ์ฃผ์์๋ 8byte(62bit์ฒด๊ณ)ํฌ๊ธฐ์ vtable์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ป๊ฒ ํจ์๊ฐ vtable์ ์๋์ง ์๊ณ ์ ๊ทผ์ ํ์ง?
2.1 ๋คํ์ฑ, ์ปดํ์ผํ์, ๋ฐํ์ ๊ทธ๋ฆฌ๊ณ vtable์ ๋ํ ๊ณ ์ฐฐ
๋ฐํ์ ๋์์ ์คํ๋๋ ๋คํ์ฑ์ ๋ฐํ์๋คํ์ฑ์ด๋ผ๊ณ ํ๋ฉฐ, virtualํค์๋, vtable์ ์ํด ๊ตฌํ๋๋ค. ๋ฐํ์์ ์ ํด์ง๋ ~์ ์๊ด์์ด ์ผ๊ด๋~~~~~~~~ ๋คํ์ฑ์ ~์ด๋ค. ์ด๋ฅผ ์ํด ํ์ํ ์ ์ฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- virtualํจ์๋ ์์ ํด๋์ค์์๋ ๊ณ์ virtualํจ์์ด๋ค.
- ์ปดํ์ผ๋ฌ๋ ๊ฐ์ํจ์๋ฅผ vtable์ ํน์ ์์น๋ฅผ ์ฐธ๊ณ ํ๋ผ๋ ๊ธฐ๊ณ์ด๋ก ๋์ฒดํ๋ค.
2.1.1 virtualํจ์๋ ์์ ํด๋์ค์์๋ ๊ณ์ virtualํจ์์ด๋ค.
ํน์ฑ ๋งด๋ฒ ํจ์์ virtualํค์๋๊ฐ ์ง์ ๋๋ฉด ์ด๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ค์ virtualํค์๋๋ฅผ ์ ์ง ์์๋ ํด๋น ํจ์๋ virtualํจ์๊ฐ ๋จ
-> ์ด๋ฌํ ํน์ฑ์ด ์์ด์ผ, ์์ํ๋ ํด๋์ค๋ค์์๋ ๊ฐ์ํจ์๊ฐ ํญ์ ๊ฐ์ ์์น์ ์๊ฒ ๋๋ค.
์์์์ Baseํด๋์ค์ listen1()๋ ๊ฐ์ฅ ๋จผ์ ์ ์ธ๋๋ virtual ํจ์์ด๋ฏ๋ก, vtable์ ์ฒซ๋ฒ์งธ ์ฃผ์์ ์์นํ๋ค. ์ดํ Base๋ฅผ ์์ํ๋ ํด๋์ค๋ค์์ ๋ณ๋์ virtual ํจ์๋ค์ ์์ฑํ๋ค๊ณ ํ๋๋ผ๊ณ , listen1()์ ์์ํ vtable์ ์ฒซ๋ฒ์งธ ์์น์ ์๊ฒ ๋๋ค.
2.1.2 ์ปดํ์ผ๋ฌ๋ ๊ฐ์ํจ์๋ฅผ vtable์ ํน์ ์์น๋ฅผ ์ฐธ๊ณ ํ๋ผ๋ ๊ธฐ๊ณ์ด๋ก ๋์ฒดํ๋ค.
์ปดํ์ผ๋ฌ๊ฐ ํน์ ๋งด๋ฒ ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ ๋, ๋ค์์ฒ๋ผ ๋์ํ๊ฒ ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ์์ฑํ๋ค(in ์ปดํ์ผํ์).
- ์ผ๋ฐ ํจ์๋ฉด ํด๋น ํจ์์ ์ฃผ์(.data)๋ฅผ ํธ์ถ
- ๊ฐ์ํจ์์ด๋ฉด ๋ฌด์กฐ๊ฑด vtable์์ ํ ๋น๋ ์์น๋ฅผ ์ฐธ์กฐํ๊ฒ ์ด์
๋ธ๋ฌ๋ฅผ ์์ฑํ๋ค.
- ์ฒซ๋ฒ์งธ ๊ฐ์ํจ์๋ vtable์ ์ฒซ๋ฒ์งธ ์์น๋ฅผ call
- ๋๋ฒ์งธ ๊ฐ์ํจ์๋ vtable์ ๋๋ฒ์งธ ์์น(+8byte)๋ฅผ call
๋ฐ๋ผ์, listen1()์ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ๋ณํํ ๋, ์ค์ ํด๋์ค์ ๋ฐ๋ผ์ Baseํด๋์ค๋ฅผ ํธ์ถํ๋, ๊ทธ ์์ ํด๋์ค๋ฅผ ํธ์ถํ๋, ์ ์บ์คํ ๋ Base ํฌ์ธํฐ์์ ํจ์๋ฅผ ํธ์ถํ๋ ์๊ด ์๋ค. ๊ทธ๋ฅ ์ธ์คํด์ค ์ฃผ์๊ฐ ๊ฐ๋ฅดํค๋ vtable๋ก ๊ฐ์ ์ฒซ๋ฒ์งธ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ผ๊ณ ํ๋ฉด ๋๋ค.
vtable์์ฒด๋ ์ปดํ์ผ ํ์์์ ๊ฒฐ์ ๋์ง๋ง, ์ด๋ค vtable์ ์ฐธ์กฐํ๊ฒ ๋๋์ง๋ ๋ฐํ์์ ํฌ์ธํฐ์ ์ด๋ค ํด๋์ค๊ฐ ํ ๋น๋๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ด๋ ๊ฒ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก vtable์ ์ฒ๋ฆฌํ๋ฉฐ ๋คํ์ฑ์ด ๊ตฌํ๋๋ค.