system/writeup 썸네일형 리스트형 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 주소를.. 더보기 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를 만들어준다. ( 정말 모르겠어서 라업을 참조했다 )엄청 긴 .. 더보기 2018 codegate baskinrobins31 baskinrobins31 2018 codegate baskinrobins31your_turn 함수에서 rop가 터진다.canary도 없고 계속해서 overflow가 터지므로 첫 번째 your_turn에서 libc를 leak하고 그 다음 turn에 system("/bin/sh")를 해주면 편하다.신경써야 할 것은 64비트 rop라는 것 뿐이다. from pwn import *e = ELF('./BaskinRobins31')s = process(e.path)l = ELF('/lib/x86_64-linux-gnu/libc.so.6')ru = lambda x: s.recvuntil(x)sl = lambda x: s.sendline(x)p = lambda : pause()io = lambda : s.inte.. 더보기 2016 hitcon sleepyholder sleepyholder 2016 hitcon sleepyholder이 문제는 secretholder와 비슷하지만 다른점은 huge_secret이 처음에 할당만 할 수 있고 wipe, renew가 불가능하다는 점이다. 여기서 뭔 기법을 써서 풀어야할까 매우 고민했다. 큰 heap을 할당할 수 있으니 fastbin dup consolidate를 생각했는데, 나는 이 기법이 fastbin을 두 번 할당받고 싶을 때 사용하는 기법이라고만 생각했었는데 아니었다.이 기법을 이용하면 fastbin 크기를 smallbin으로 사용할 수 있는 놀라운 일이 벌어진다. 즉, fastbin으로 병합을 할 수 있다는 것이다.. 또한 secretholder에서 발견한 취약점인 nextchunk의 prev size를 바꿔줄 수 있.. 더보기 2016 hitcon secretholder secretholder 2016 hitcon secretholdersmall secret을 할당하고 쓸 때 40바이트 할당하므로 다음 chunk의 prev size를 덮을 수 있다. 전역 변수에서 각각의 heap address를 관리한다. -> unsafe unlink 물론 전역변수를 통해 입력도 받는다. 앞으로 힙오버만 있으면..! free할 때 전역 변수에 저장되어 있는 heap address를 초기화하지 않는다. -> 같은 곳을 여러번 해제 가능 huge chunk를 맨 처음으로 오게할 수 있다면 small_buf를 이용하여 free한 후 UAF를 일으킬 수 있다.그 다음부터는 fake chunk를 만들어 unsafe unlink를 trigger하고 free_got를 puts_plt로 덮어 leak.. 더보기 2017 secuinside ohce ohce 2017 secuinside ohceread_input 함수에서 32글자를 기준으로 input buffer의 길이가 오르락 내리락 한다. 우리의 input이 들어가는 변수는 ebp-0x20 영역이다. 즉 31글자를 넣으면 input buffer의 길이가 늘어나는 일 없이 ebp의 값을 leak할 수 있을 것이다. 근데 echo 함수를 보면 입력 받은 길이를 계산하여 그만큼만 SYS_write로 출력해 준다. 하지만 sub_40026D 함수 때문에 이조차도 회피할 수 있다. *v1이 있으면 계속해서 길이를 더해주는데 31글자를 넣을시 ebp까지 계산하므로 31글자를 넣고 38의 길이를 가질 수 있는 상황이 발생한다. A를 31글자를 넣었을 때 스택 상황은 위와 같다. reverse_echo로 이를.. 더보기 이전 1 ··· 6 7 8 9 10 11 12 13 다음