지금 malloc.c 분석을 하며 문서를 작성하느라 블로그에 올릴게 없다.. 그 동안 풀어봤던 문제들 몇개를 계속 올려야겠다. 2018 코게 예선으로 나온 baskinrobins31이다 간단한 64bit ROP이다. 64bit, partial RELRO뿐이다. 메인의 내용은 별거없으니 pass한다. int main() { Intro() your_turn() computer_turn() } your_turn()에서 입력받을때 bof가 충분히 터지고 got overwrite이 가능하기에 ROP로 shell취득이 가능하다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ..
이번 20회 해킹캠프에서 campnote라는 문제를 풀었는데 아직도 fastbin dup이 어려워서 정리한번 하려고한다. 조건 fast사이즈의 chunk를 자유자재로 할당, 해제할 수 가 있어야 한다. free된 chunk에 대해서 free를 또 할 수 있어야 한다. libc_leak top_chunk와 인접하지않게 small, large 사이즈의 청크를 할당, 해제하면 해당 청크에 fd, bk에 의 주소가 박힌다. 보이는 것처럼 main_arena로 와서 - 0x10만큼 빼고 거기서 malloc_hook의 오프셋을 빼면 libc_base를 구할 수 있다. base = - 88 - mallo_hook_offset - 0x10 setting 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ..
딱히 올릴려는 생각은 없었는데 원샷가젯을 처음 사용해봐서 올린다. @~@ 이전 rtc글과는 다른점은 페이로드가 짧아졌다는 점? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 from pwn import * context.log_level = 'debug' p = remote('ctf.j0n9hyun.xyz', 3025) e = ELF('./rtc') l = e.libc setcsu = 0x00000000004006BA csu_call = 0x00000000004006A0 one_offset = 0xf1147 write_got = e.got..
배우려다가 2달 지연된 rtc.. rtc는 return to csu의 약자로 바이너리 안에 존재한는 csu함수 또는 init fini를 이용해서 익스하는 기법이다. 바이너리는 실행시키자마자 바로 bof를준다. 64bit rop로도 exploit가능한 문제. 대충 rtc를 설명하자면 40073A부터 쭉 내려오는 pop register 들을 이용해 레지스터에 값을 넣고 400720을 통해 edi(rdi) rsi rdx에 값을 넣어주고(인자전달) call에 원하는 함수_got를 넣어서 실행(r12)시키고 cmp와 jnz의 조건을 맞쳐서 계속 chain해주면 된다. 가젯으로 40073A와 400720의 주소를 사용할예정이다. (40073A, 400720)가젯은 해당주소부터 쭉 내려오면서 ret을 만날때까지 실행..
동아리 선배들한테 받은 문제 이 문제는 어셈으로 만들어져서 ida의 디컴파일의 기능이 안먹는다. 직접 어셈보고 해석한 문제 https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ Linux System Call Table for x86 64 · Ryan A. Chapman Linux 4.7 (pulled from github.com/torvalds/linux on Jul 20 2016), x86_64 Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax To find the implementation of a system call, ..
여차여차해서 18위내로 통과..