Universal Shellcode(4)-실습
이 글은 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇을 보고 정리한 글입니다.
자 이제 이론을 다 알았으니 이론을 토대로 제작을 쉘코드를 제작하도록 하겠습니다. 다음과 같은 단계로 소스를 구성하도록 하겠습니다.
1.Kernel32.dll base 주소를 얻어온다.
2.Export Diretory,Name,Ordinals,Address Table 주소를 구한다.
3.2를 바탕으로 함수의 주소를 구한다.
4.3을 이용하여 함수를 실행한다.
1.
자 여기까지가 1번 단계까지의 소스코드 단계이다. 대부분은 앞전에 설명 했으니 넘어가고 PEB에 접근 하는 부분을 유심히 보자. TEB에 대한 접근을 fs레지스터를 이용하여서 하고 있는 부분이다. 앞전에 이론에서 설명했듯이 fs레지스터를 이용하면 TEB를 이용할 수 있다고 하였다. fs레지스터가 teb주소값을 담고 있기에 fs: [0x30] 은 즉 teb+0x30에 위치한 것과 같은 데이터 이기에 fs를 이용하여 PEB에 접근한다. 그 후에는 각각의 위치에 맞게 이동하여서 EBX에 커널 BASE 주소를 얻어 냈다.
2.
자 이제 여기서 첫줄을 보면 edi에 [ebx+0x3c]값을 가져왔다. 저 값은 ebx가 지금 base dll 주소이고 0x3c는 pe헤더상 offset to New Header부분의 주소 이다. nt header까지의 offset을 구하고 다음줄에 edi에 ebx를 더해 두번째 줄이 수행되면 edi는 nt헤더의 주소까지 들어간다. 그후 각각의 역할을 수행한다.
3.
자 그리고 각각의 함수의 주소를 구한다. 여기서 보면 get_func_addr 함수와 각각의 인자로 함수 주소를 구하는 것을 볼 수 있다. 이러한 것들은 밑에 자세히 설명할테니 일단은 흐름을 보자.
4.
그리고 다음과 같이 함수를 실행시킨다. 자 이런식으로 쉘코드를 작성할 수 있다. 이제 우리가 알아야 할것은 함수주소를 얻은 get_func라는 함수와 주어진 인자값은 무엇인가를 의문이다.
자 먼저 함수 주소를 구하기 위해서는 3가지 단계가 있다고 하였다.
1.Name Diretory에서 일치하는 함수가 몇번째 인덱스인지 확인한다.
2.Ordinals Diretory에서 확인한 인덱스의 값을 확인한다.
3.Address Diretory에서 확인한 값에 위치한 인덱스에 들어있는 주소를 가져온다.
이렇게 였다. 여기서 1번에서 함수 이름이 일치하는 함수를 찾기 위해서 hash를 해야한다. 함수명을 hash하여 찾지 않고 직접 비교하여 찾을경우 쉘코드가 매우 길어지며 연산 속도가 느려진다. 따라서 하나하나 직접비교보다 해쉬연산을 통해 함수를 찾는다.
여기서 우리가 사용하는 해쉬연산은 각 문자의 아스키 값을 모두 더하는 것이다.
따라서 WinExec함수의 해쉬 값은 =w(0x57)+i(0x69)+n(0x6e)+e(0x45)+x(0x78)+e(0x65)+c(0x63) = 0x2b3 이다. 위에 call Exec부분을 보면 0x2b3을 인자로 주어 호출 하는 부분을 볼 수 있다.
자 이제 이렇게 hash부분까지 완성을 마쳤다. 이제 이 소스들의 바이트코드를 따와 쉘코드를 만들면 끝이다.