write-up/pwnable 5

PlaidCTF 2013 ropasaurusrex

인터넷에 풀이가 많이 있는데, 대부분 GOT덮고 system 함수를 부르는 방법이다. 쉘코드를 올려서 푸는 방법으로 풀이 해보고자 한다. 바이너리에는 NX가 걸려있기 때문에 바로 쉘코드로 뛰면 segmentation fault가 뜰 것이다. 그래서 mprotect 함수로 실행 권한을 풀어주고, 그쪽으로 뛰어주면 되겠다. 시나리오는 다음과 같다. 1. GOT를 이용해 libc 릭 2. 취약한 함수를 다시 불러서 오버플로우를 한 번 더 발생시킨다. 3. mprotect 함수로 bss에 rwx권한을 모두 준다. (prot=7) 4. read 함수로 bss에 쉘코드를 받는다. 5. read 함수가 끝나고 쉘코드 주소로 뛴다. 앞서 언급한 GOT를 덮는 방법으로 풀어본 경험이 있다면, 페이로드를 짜는데 특별히 까..

write-up/pwnable 2019.07.11

Codegate 2018 BaskinRobins31

첫 64비트 문제이다 ! 바이너리를 실행하면 베스킨라빈스 게임을 시작한다(....) 그래서 문제 이름이 베스킨라빈스 취약점은 your_turn 함수에서 터진다. read함수 Xref기능으로 찾으니 순식간에 찾았다. 400바이트만큼 s에 받는데, s는 rbp로부터 0xB0바이트 (176 바이트) 떨어져있다. 까나리가 없고, NX가 걸려있으므로, 바로 조지면 된다. 시나리오는 아래와 같다. 1. read 함수로 bss에 "/bin/sh\x00" 받는다. 2. write 함수로 read함수 got를 릭한다. 3. libc 베이스 주소를 구하고, system함수 주소를 구한다. 4. read 함수로 read함수 got에 system함수를 쓴다. 5. read 함수를 호출하면 system함수가 호출된다. 그런데...

write-up/pwnable 2018.08.18

Codegate 2014 Nuclear

꽤 오래 걸렸던 문제 이 문제도 소켓이다. 1129번 포트(?)로 소켓을 연다 취약점 찾는데 좀 노하우(?)가 생긴 것 같다. recv나 scanf함수 같은걸 Xref해서 찾으면 빨리 찾더라. 취약점은 정말 금방 찾았다. start_routine 함수에서 buf는 ebp-0x20c에 있는데, 1298만큼 받으니까 바로 터진다. dummy 0x20c + 4 + eip이다. 그런데 fd까지 덮히므로, "Sorry.. we can't..." 문자열을 출력하기 위해 익스할 때는 fd를 4로 맞춰서 했다. 저 취약점을 트리거 하기 위해서는 메뉴에서 launch를 입력하면 되고, strcmp로 passcode와 cmd를 또 비교한다. 그렇다. 까나리가 없는 대신 passcode를 릭해야 하는 것이다. 어떻게 릭할지..

write-up/pwnable 2018.08.14

Codegate 2014 Angrydoraemon

까나리랑 NX가 걸려있다. 아래는 메뉴이다. 취약점은 4번 메뉴에서 터진다 y를 입력하면 sprintf와 write로 buf를 출력해주지만... 여기서 까나리 릭이 가능하다. buf는 0xa (10)바이트 이므로, buf에 "y" + "A"*9를 sendline으로 보내주면 까나리 마지막 바이트가 0x0a로 덮히고, 릭이 되고, smashing the stack이 발생한다. 그리고 다시 접속해서 "y" + "A"*9 + canary + "B"*0xc + EIP를 주면 EIP가 덮힌다. 이 문제도 소켓이므로.... 리버스 쉘을 따야한다. buf_global이 bss이고 크기가 넉넉하므로 여기를 이용하기로 한다. 1. read로 "sh >&4 0&4 0

write-up/pwnable 2018.08.09

Codegate 2017 babypwn

까나리랑 NX가 걸려있다. v2에서 스캔(recv)를 받으면서 취약점이 터진다.그런데 v3에 까나리가 있다.바로 다음줄에 puts가 있으므로 까나리 릭이 가능하다. "A"*28 넣고 sendline으로 보내면 0x0a까지 들어가므로, 까나리 한 바이트를 덮는다. 그러면 릭이 가능하다(널을 만날 때 까지 출력하므로)0x0a까지 넣어서 까나리 한 바이트를 덮는 것은... 까나리가 00으로 끝나기 때문에, 딱 v2의 크기인 28바이트만 넣으면 까나리 출력이 안 된다. 그런데 바이너리에 서비스(?)로 system함수의 plt가 있다. 까나리 맞추고 더미 준 다음에 bss에 "/bin/sh\x00" 올리고 system 불러주면 뚝-딱인데, 이 바이너리는 socket을 여는 바이너리이다...이렇게하면 서버에서 쉘이..

write-up/pwnable 2018.08.09