둘둘리둘둘리둘둘리둘둘리둘둘리둘
[Fedora Core 3] gate -> iron_golem 본문
[gate@Fedora_1stFloor ~]$ cat ./iron_golem.c
/*
The Lord of the BOF : The Fellowship of the BOF
- iron_golem
- Local BOF on Fedora Core 3
- hint : fake ebp
*/
int main(int argc, char *argv[])
{
char buffer[256];
if(argc < 2){
printf("argv error\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
Fedora core3부터는 redhat보다 제대로 된 ASLR이 적용되고, 라이브러리 주소가 0x00으로 시작되고, NX-Bit가 존제한다. 이 말은 즉 프로그램 내의 버퍼에 쉘코드를 입력할 수 없고, RTL chaining도 못쓰고, 스택과 힙 영역에서 쉘코드를 실행할 수 없단 말이다.
소스는 위와 같고 힌트는 fake ebp다. 다른 방법이야 많겠지만 힌트를 보아하니 SFP를 조작해야겠다..
먼저 buffer기준에서의 SFP의 위치를 알기위해 buffer+dummy의 크기를 알아보자.
(gdb) b *main+112
Breakpoint 1 at 0x8048440
(gdb) r DDDDDDDD
Starting program: /home/gate/iron_gole1 DDDDDDDD
(no debugging symbols found)...(no debugging symbols found)...DDDDDDDD
Breakpoint 1, 0x08048440 in main ()
(gdb) x $esp
0xfeefef80: 0x00000000
(gdb) x/24 $esp
0xfeefef80: 0x00000000 0xfeefefd4 0x0070b423 0x0072ca0e
0xfeefef90: 0x44444444 0x44444444 0x00000000 0x00000000
0xfeefefa0: 0x00000000 0x0072cad0 0x007279b8 0x0071f338
0xfeefefb0: 0x00719b88 0x00000003 0x00719e40 0x00719e70
0xfeefefc0: 0x0177ff8e 0x0804824c 0x00718fb4 0x007196a4
0xfeefefd0: 0x0804824c 0xfeeff0a8 0x0070b642 0x0804818c
(gdb) x $ebp
0xfeeff098: 0xfeeff0f8
보다시피 0xfeeff098-0xfeefef90=0x108 즉 264byte다.
이번 문제에서는 <execl+3>을 사용할 것인데, 먼저 execl함수의 원형은 아래와 같다.
[int execl( const char *path, const char *arg, ...);]
execl은 첫번째 인자(ebp+8)를 실행한다.. 그렇다면 main의 SFP를 ASLR이 적용안되는(고정된) 영역을 가리키는 주소-8로 덮어씌우고 execl이 프롤로그를 실행하지 않고 바로 동작 하게 된다면 main SFP를 그대로 ebp로 쓸 수 있게 된다.
그럼 fake ebp+8이 가진 주소가 가리키는 값을 파일명으로 가진 쉘 실행파일을 만들어주고, 페이로드는
[ 더미(264) | fake ebp | execl+3 ]이 되겠다.
--풀이--
'War game > 해커 스쿨 FC3' 카테고리의 다른 글
[ Fedora Core 3 ] dark_stone -> Clear !! (0) | 2015.08.23 |
---|---|
[ Fedora Core 3] hell_fire -> evil_wizard (0) | 2015.08.23 |
[ Fedora Core 3] dark_eyes -> hell_fire (0) | 2015.08.23 |
[Fedora Core 3] iron_golem -> dark_eyes (0) | 2015.08.22 |