2010.01.17 14:04 System


Exploit 을 하기 위해 반드시 필요한 셸 코드 작성법

한참 BOF나 FSB 공부할때 익혔던 방법들이 슬슬 가물가물해 지는 타이밍이라

기억도 되살릴겸 포스팅 하기로 했다

셸 코드에는 Null byte가 들어가서는 안되고 작으면 작을 수록 그 가치는 상승한다

물론 최신 셸 코드 작성법에는 아직 손을 못댔지만

일단 내가 할 수 있는 범위까지 줄여보도록 하겠다

먼저  우리가 이용할 함수들을 파악하자

1. setreuid ( uid_t ruid, uid_t euid)
2. execve ( const char *filenam, char *const argv[] , char *const envp[])

이대로 각각 인자들을 삽입해주고 시스템 콜을 실행하면 된다

완성된 코드를 먼저 보자



3~7 번째 줄은 : setreuid 를 호출하는 부분이다

3번째에서 eax를 초기화 해주고

setreuid의 시스템 콜 번호 70을 al에 넣어준다

그 후에 나머지 ruid, euid 를 0으로 넣어주고 시스템 콜을 호출 하면 끝


다음은 execve 함수를 호출하는 부분인데

setreuid 보다는 살짝 복잡하다

인자 하나씩 살펴보자

먼저 실행된 후의 stack 구조를 살펴보면 다음과 같다


 0  push ecx
 \x68732f2f ;"/sh"  push 0x68732f2f
 \x6e69622f ;"/bin"  push 0x6e69622f 
 mov ebx, esp
 0  push eax
 /bin//sh 문자열 주소  push ebx
 mov ecx, esp


여기서 ebx 는 3번째 mov ebx, esp 에 의해

/bin//sh의 문자열 주소를 가지고 있고

ecx 는 mov ecx, esp 에 의해 /bin//sh 와 0 을 배열로 갖는 포인터의 주소를 갖게 된다

edx는 0으로 초기화 해주고

execve의 시스템 콜 번호인 11번을 넣고

시스템 콜을 호출하면 끝이다

여기에서 좀 더 크기를 줄일 수 있는 방법이 있는데

xor eax, eax
mov al, 70


push byte 70
pop eax

로 바꾸고

xor edx, edx

cdq

로 바꾸는 것이다.

첫번째 기법은 stack 이 4바이트 단위로 이루어져있으며 한byte만 넣을경우

나머지 3byte가 0으로 채워지는 것을 이용한 것이다

두번째는 cdq가 eax가 0 이상이면 edx는 1로 채워지고 eax가 0 이상이면

edx가 0으로 채워지는 것을 이용한 것이다

이를 이용해서 최종적으로 쉘 코드를 구해보면


다음과 같이 31바이트로 쉘코드를 완성한것을 볼 수 있다.




참조: 해킹, 공격의 예술

'System' 카테고리의 다른 글

System Information 을 가져오는 API  (2) 2010.04.21
What is VCP[Virtualized Code Protection]?  (0) 2010.01.29
셸 코드 작성  (0) 2010.01.17
2008 JFF 8번 문제 풀이  (0) 2010.01.10
[펌]교착 상태와 그 조건  (0) 2010.01.02
What is CALLBACK function?  (0) 2010.01.01
Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday42
Today26
Total328,587

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 받은 트랙백

글 보관함


. .