본문 바로가기

system

2019 codegate aeiou aeiou 2019 codegate aeiou힙문제인줄 알고 엄청 고민하다가 대회 끝나갈때쯤 god_the_reum 풀면서 갑자기 아는 형이 2017 codegate hunting 풀 때 처음에 thread를 이용한 canary bypass로 풀려고 했던게 생각나서 해봤는데 대회 끝나고 나서야 푸네요 ㅠㅠㅠㅠㅠ 본선 1등차이 하... 이 문제를 풀기 위해서는 쓰레드에 관한 개념을 알아야 한다. 리눅스는 x86: gs, x86_64: fs 레지스터로 TLS를 관리한다. TLS란 쓰레드를 관리하기 위한 전역변수이며 해당 변수의 0번 째 인덱스에는 TCB(Thread Control Block)의 주소가 저장된다.TCB란 말그대로 해당 쓰레드를 관리하기 위한 구조체라고 보면 된다. xxxxxxxxxxtypede.. 더보기
2017 rctf rnote RNote 2017 rctf rnote1byte_overflow1byte_overflowstartoverwrite_heap_addrlibc_leakfastbin_dupfastbin_dup_into_malloc from pwn import *​e = ELF('./RNote')#s = process(e.path)s = process(e.path, env={'LD_PRELOAD':'./libc.so.6'})l = ELF('./libc.so.6')​ru = lambda x: s.recvuntil(x)sl = lambda x: s.sendline(x)p = lambda : pause()io = lambda : s.interactive()​def menu(sel): ru(': ') sl(sel)​def add(si.. 더보기
2019 insomnihack onewrite onewrite 2018 insomnihack onewritePIE가 걸려있다.. 근데 바이너리에서 PIE를 leak해주니까 상관없다! 둘 중 하나를 leak해주고 1byte aribtrary write가 가능하다. 처음에 stack을 leak한 후 ret을 덮어씌워 돌아가 pie를 leak하면 둘 다 leak할 수 있다. 하지만 이제부터 어려워지는데 이런 상황이 계속된다면 ret만 한 번 바꿀수 있지 다른 곳에 값을 못쓴다.. 근데 do_leak 함수의 시작 부분에 가보면 do_leak의 주소값을 rbp+0x10에 넣어준다. 즉, 저 근방으로 jump하면 rbp+0x10의 do_leak, do_overwrite를 들어갈 때 남기는 do_leak, 총 두개가 스택에 남아 한 번의 write를 할 수 있는.. 더보기
2019 codegate god-the-reum god-the-reum 2019 codegate god-the-reum모든 보호기법이 걸려있다. 이번 코게 문제는 PIE가 상당히 많이 걸려있었다. 바이너리를 살짝 실행시켜보면 힙관련 문제임을 느낄 수 있는데 2.27 glibc를 제공해주기까지 헀으니 tcache 관련 문제임을 알 수 있다. 1eth를 가진 첫 번째 wallet을 할당했을 때의 모습이다. 두 개의 heap을 할당하는데 첫 번째 heap은 wallet의 address, 두 번째 heap은 wallet의 eth 정보를 가진다. 위 두 heap은 main의 wallet 지역변수에서 관리된다. withdraw 했을 때 총 가격이 0원이라면 free해주는데 double free에 관한 검사가 전혀 존재하지 않는다. -> tcache dup sho.. 더보기
2018 codegate zoo zoo 2018 codegate zooxxxxxxxxxx+ 0: owner_name+ 16: animal1_chunk+ 24: animal2_chunk...+ 48: animal5_chunk0x40 크기의 owner chunk에서 animal chunk를 관리한다. xxxxxxxxxx+ 4 : name+ 392 : likes+ 396 : food_removed+ 400 : food+ 404 : dung_removed+ 408 : dung+ 412 : ill+ 416 : prescribed medicineanimal chunk는 이외에도 많지만 info 함수에서 확인할 수 있으므로 위 정보만 기억해두고 가면 된다. animal name에 20바이트만큼 받아 heap addr leak이 가능하다. (dung.. 더보기
2018 codegate super marimo super marimo 2018 codegate super marimo처음 init_marimo 부분에서는 0x20 크기로 malloc, 0x20만큼 입력받는다. 잘 작성되어 있다. 근데 profile을 수정하는 부분에서는 32보다 많이 받는다. 즉 heap overflow가 발생한다. view에서 정보들을 출력해주기 때문에 leak이 가능하며 위에 프로필 재입력 부분에서 *(a1+2)를 참조하여 입력하므로 arbitrary write가 가능하다. exploit을 짜면서 잘 보면 got를 system으로 바꿔 쉘을 실행시킬만한 함수가 보이질 않는다. ( 다풀고 풀이 보니 strncmp가 있네요 왜 못봤지 ㅠㅠ )처음에는 exit got를 one gadget으로 덮어 풀려고 했는데 안돼서 stack 주소를.. 더보기
dynamic, static, pie.. 보호되어 있는 글입니다. 더보기
2018 codegate superftp superftp 2018 codegate superftpsel의 값을 입력받고 switch문으로 들어가는데 case '1'이 아니라 case 1이어서 16진수로 '\x01'을 입력해야 한다. 회원 가입을 하면 chunk를 만들어 주는데 형태는 다음과 같이 id, pw, name, age가 24단위로 써진다. (string으로) 로그인 할 때 login_num을 증가시킨다. id, pw를 입력받는 과정에서 stack overflow가 발생한다. (canary 존재) user_download는 heap에 받지만 admin_download는 stack에 받는다. A/B/../C 를 입력하면 A/C로 바뀐다. /../를 제거한 후 /를 찾아서 A/C를 만들어준다. ( 정말 모르겠어서 라업을 참조했다 )엄청 긴 .. 더보기