본문 바로가기

전체 글

(187)
dreamhack / nullnull 보호되어 있는 글입니다.
(glibc 2.29) _int_free glibc 2.26버전과 비교했을때 핵심 부분만 작성할 것이다 더보기 인자 및 변수 (삭제) 변경 및 추가된 코드 선언되는 일부 변수 삭제 더보기 const char *errstr = NULL; int locked = 0; 2.26버전에서 사용되었던 locked와 errstr가 삭제되었다 이를 통해 해당 버전에서는 errstr에 에러 시 출력될 문자열을 errstr에 저장해 출력하는 것이 아닌 malloc_printerrr를 통해 출력한다 initial_check (변경, 추가) 변경 및 추가된 코드 errorout 레이블 삭제 tcache관련 코드 추가 및 변경 더보기 errorout 레이블 삭제 if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)..
(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..