pwnable

    [Pwnable] Register

    이번에는 register 문제이다. 이건 풀면서 되게 재밌었던 기억이 난다. canary, NX, partial Relro main은 심플하다. 바로 build로 넘어가보자 build에서는 SIGALRM이 발생하면 handler라는 놈으로 처리한다. handler 내부를 뒤적거리다가 exec_syscall_obj가 보이는데 result에는 obj의 주소값이 넘어간다. 그리고 syscall을 해준다. 그리고 get_obj 함수이다. get_obj에는 문제 제목처럼 register 값을 입력하는거 같다. 그리고 validate_syscall_obj 함수인데 v0[0] = rax를 체크하는 루틴같다 그러면 대충 전체적인 로직을 파악했을때 어떻게 익스를 할 수 있을까 간단하다 exec_syscall_obj에서 ..

    [Pwnable] RTC

    진짜 오랜만에 롸업이다 사실 문제는 푼 지는 되게 오래됬지만 최근들어 대학은 가야되는데 해킹 공부를 하고 있는게 맞는건가 싶기도 하고 그냥 요즘 들어 마음이 복잡하기도 해서 여태까지 문제는 많이 풀었는데 롸업은 올리지 않았다 뭐 사실 최근에 힙 다 까먹어서 다시 정리하고 있기는 한데ㅋㅋ; 그냥 오늘은 새벽에 생각 정리도 할려고 롸업을 써보려고 한다 아마도 롸업 여러개가 올라갈거 같긴 한데 어짜피 어려운 문제는 아니니까 후딱 써보도록 하자 잡담이 길어졌는데 진짜 시작~ - Mitigation - 0x200만큼 받아서 bof 발생 -> rop 가능 사용 가능한 함수에 puts가 없어서 rdi 가젯만으로는 libc leak 불가능 그러면 read, write로 libc leak을 해야되는데 gadget도 없음..

    [Pwnable] SysROP

    오늘은 SysROP 문제를 풀어보자 우선 NX Bit만 Enabled 되어 있어서 그냥 심플한 ROP 문제일거라고 생각했다. ??: 물론 디버깅을 하기 전까지 별 특별한 거는 없고 read에서 BOF가 터진다. 근데 문제가 생겼다. 출력을 해주는 함수가 없어 leak을 하지 못한다. 이럴때는 Syscall을 이용한 ROP 방법이 있다. 우선 Syscall에 대해서 간략하게 알아보자 What Is Syscall? user단에서 커널단에게 파일을 읽거나 쓰는 특정 작업을 요청할 때 사용되는 어셈블리이다. 유저단에서 커널단으로 요청할때 사용되는 어셈블리가 syscall, int 0x80 이다. (int는 자료형이 아니라 interrupt의 줄임말이다) 우리는 "int 0x80" 명령어가 없으니 syscall ..

    [Pwnable] RTL_Core

    250점 첫 문제다 :D 바로 풀어보자 NX bit만 enabled 되어 있고 Partial RELRO가 걸려있다. 실행시키면 패스코드를 입력하라는 문자열과 함께 아무 값이나 입력하면 실패! 라고 알려준다 아이다로 열어보자 입력값 s가 인자로 들어가는 check_passcode의 리턴값이 hashcode와 같게 되면 core 함수가 실행된다. hashcode는 0x0C0D9B0A7 (3235492007)이다. check_passcode를 살펴보자 반복문을 살펴보면 v2 += 0 + a1 v2 += 4 + a1 v2 += 8 + a1 v2 += 12 + a1 v2 += 16 + a1 그 후 v2를 리턴해준다. 그렇다면 v2의 값이 hashcode (3235492007)와 같아져야 한다. 그럼 hashcod..

    [Pwnable] Random Key

    오늘은 마지막 200점 문제이다 :D NX bit만 걸려있으며, Partial RELRO이다. 실행을 시키면 인증 프로그램이라는 문자열과 함께 key를 입력하고 "Nah.."라는 문자열을 출력한다. 아이다로 열어보면 v5에 랜덤 값이 들어가며 우리가 입력하는 입력값이 v4에 들어가게 된다. 만약 우리의 입력값이 랜덤 값인 v5와 일치하게 된다면 flag를 보여주는데 우리가 프로그램에서 돌아가는 랜덤값을 어떻게 유추할 수 있을까? 코드를 다시 한번 잘보면 v3에 time 함수가 들어갑니다. time() = 시간에 대한 정보를 얻어오는 함수 결론은 srand로 시드값을 현재 시간으로 설정하고 rand로 랜덤값을 뽑는다. 그렇다면 시드값이 동일하면 rand값도 동일하니, 내 컴퓨터에서의 seed와 서버에서의 ..

    [Pwnalbe] 1996

    오늘은 1996이라는 문제를 풀어볼거다. 굉장히 쉬운 문제였던거 같다. NX bit가 enabled 되어 있고 partial relro가 걸려있어 _DYNAMIC 섹션에 write 권한이 없다. 바로 아이다로 열어보자 c++ 바이너리이다. 우선 "Which environment variavle do you want to read"라는 문자열을 출력해주고 getenv로 name에 입력을 받는다 하지만 getenv에서 length check를 해주지 않으니 BOF가 터질거 같다. 취약점은 파악했으니 어떤 방식으로 익스를 해야될지를 생각해봐야된다. 위에서 이 문제가 어렵지 않다고 한 이유가 쉘을 띄워주는 함수가 내장되어 있다. 그럼 익스 코드를 쉽게 구상할 수 있다. buf [0x410] + SFP [0x8]..