hint
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main ()
{
char str[256];
setreuid(3093, 3093);
printf("문장을 입력하세요.\n");
gets(str);
printf("%s\n", str);
}
풀이
1. RTL 방법으로 풀이한다.
1-1 $ cp attackme ./tmp/attackme
1-2 $ gdb attackme
1-3 (gdb) b *main+3
1-4 (gdb) print system
1-5 (gdb) print exit
(RTL은 Return to Libc 의 약자로 리턴 주소를 공유 라이브러리 함수의 주소로 적어 해당 함수를 실행시키는 방법이다. 스택의 구조를 생각해보면 system() 함수를 ret주소에 써주면 프로세스가 종료되고 리턴할 때 system()함수로 가게 된다. 또한, system() 함수가 끝나게 되면 그 다음 4바이트가 리턴주소이기 때문에 정상적으로 종료될 수 있게 하기 위해 exit()함수를 써준다.
system()함수를 사용하는 이유는 쉘을 실행해주는 함수이기 때문이고 쉘을 실행할 수 있는 다른 함수를 사용해도 된다.
또한, 인수로 /bin/sh를 넣어주는데, 위치는 스택 구조에서 매개변수는 ret주소 다음에 위치하기 때문에 결국 스택 모양을 다음과 같이 만들면 된다.
low address ... | [sfp] |[ret] system() | exit() | "bin/sh" | ... high address
)
2. "/bin/sh" 주소 구함
system() 함수는 내부적으로 /bin/sh를 실행하고 동작하는 함수이기 때문에 "/bin/sh" 문자열을 내부에 가지고 있으므로, system()함수의 주소부터 주소값을 증가해가며 찾을 수 있다.
3. 공격 명령어 작성
'WARGAME > hackerschool ftz,lob' 카테고리의 다른 글
[해커스쿨 ftz] level 14 -> level 15 (0) | 2014.08.22 |
---|---|
[해커스쿨 ftz] level 13 -> level 14 (0) | 2014.08.22 |
[해커스쿨 ftz] level 11 -> level 12 (0) | 2014.08.22 |
[해커스쿨 ftz] level 10 -> level 11 (0) | 2014.08.21 |
[해커스쿨 ftz] level 9 -> level 10 (0) | 2014.08.21 |