자세한 건 생략하고, 이런 부분이 있다.

system 함수를 사용할 수 없고, 무조건 execve만을 사용해야 한다.

system 함수는 문자열 인자 하나만을 받았지만, execve는 다르다.

execve("/bin/sh", ["/bin/sh", 0], 0) 형식으로 실행해 주어야 하는데, 가장 귀찮은 것이 바로 두 번째 인자이다.

char형 이중 포인터인데다 배열의 첫 번째 값으로는 "/bin/sh" 첫번째 인자와 같은 값이 든 주소가 있어야 한다. 왜냐하면 execve 함수의 두번째 인자는 실행할 파일의 인자로, "/bin/sh"를 실행하면 argv[0]이 당연히 "/bin/sh"가 되어야 하기 때문이다.


조금 귀찮긴 하지만 findsh를 이용해 일단 라이브러리 내부의 "/bin/sh"의 주소를 구하고, 파일에 심볼릭 링크로 해당 주소를 넣어 주었다. 그리고 gdb를 이용해 분석하여 스택 끝부분에 들어 있는 파일명+NULL을 가져와 각각의 인자로 주었다.

이는 전에 skeleton을 공략할 때(http://5kyc1ad.tistory.com/44) 사용했던 스택 레이아웃을 보면 알 수 있다.

이는 다음과 같은데, 프로그램명 다음에 NULL이 기본으로 붙는 것을 볼 수 있다.


'Wargame > Lord of Buffer overflow' 카테고리의 다른 글

LOB Redhat : assassin > zombie_assassin  (0) 2015.11.16
LOB Redhat : giant > assassin  (0) 2015.11.03
LOB Redhat : darkknight > bugbear  (0) 2015.11.02
LOB Redhat : golem > darkknight  (0) 2015.10.17
LOB Redhat : skeleton > golem  (0) 2015.10.15
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,