목록분류 전체보기 (365)
int a = 0xa; const char *b[] = "d_str"; int c; int foo(int arg) { int d = 0xd; return 0; } int main() { int *e = malloc(sizeof(*e)); return 0; } int c; bss영역 const char *b[] 데이터 영역 int a; 데이터 영역 foo() 코드 영역 "d_str" 읽기 전용 데이터 영역 int d 스택 영역 int *e 힙 영역
fwrite를 이용해 주소를 leak 한다. 필요한 인자가 4개이므로 가젯들을 찾아야 한다. csu_init을 통해 rdi, rsi , rdx를 사용할 수 있지만 rcx가 없다. gift함수를 보니 [rdi] 값을 역참조 하여 rcx에 대입한다. 이를 이용한다. rcx에 stdout를 넣어주고 바로 RTC를 진행한다. libc_base를 이용해 one_gadget을 구한 후 ret에 덮어준다. from pwn import * context.log_level = 'Debug' p = remote('ctf.j0n9hyun.xyz', 3034) elf = ELF("./Unexploitable_3") one_gadget_offset = [0x45216, 0x4526a, 0xf02a4, 0xf1147] csu_1..
코드 구성은 간단했다. 1번 메뉴에서 원하는 사이즈와 인덱스로 malloc을 할당한다. 2번 메뉴에서 원하는 인덱스를 free 한다. babyheap 문제 처럼 fastbin dup을 진행하려 했으나 어떤 식으로 libc_base를 leak 해야 할지 몰랐다. 인터넷을 참고했다. stdout의 flag를 조작하여 put함수가 실행되었을 때 주소를 출력하게 만들 수 있다고 한다. 먼저 libc_base를 leak 하는 과정을 살펴보도록 한다. unsorted bin을 생성하기 위해 0x80 이상의 크기를 할당해주었고 나머지는 fastbin으로 할당받는다. 0번째 를 free 하면 main_arena+88의 주소가 나올 것이다. unsortedbin에 첫 번째 malloc이 들어간 모습이다. stdout을 ..
Canary가 걸려있다. 먼저 read를 입력을 통해 printf로 출력을 한다. 입력을 한 번밖에 못하므로 __stack_chk_fail의 got주소를 main주소로 덮는다. 그 후 ret주소를 leak 하여 libc base를 계산한다. one_gadget를 __stack_chk_fail의 got주소에 덮는다. from pwn import * #p = process('./babyfsb') p = remote('ctf.j0n9hyun.xyz', 3032) e = ELF('./babyfsb') libc = ELF('./libc.so.6') canary_got = e.got['__stack_chk_fail'] main = e.symbols['main'] magic_offset = 0x45216 main_l..
statically linked, stripped이다. ida로 main을 찾았다 sub_43f670 = open() sub_43f6d0 = read() sub_43f730 = write() 함수를 눌러보면 무슨함수인지 유추할 수 있다. sub_43f670에 bp를 걸고 확인하면 rax에 2가 들어가 있다. sys_open을 실행하기 위해서 이다. 반환 값을 확인해본다. top_secret이라는 파일의 fd는 4이다. RSI에 r이 있으므로 읽기 전용이다. 프로그램을 실행하고 나면 flag와 top_secret 두 개의 파일이 생성되는데 flag가 fd 3번이라는 것을 유추할 수 있다. 입력받는 곳에서 BOF가 발생한다. fd를 덮을 수 있다.(dword_6cce98) -----------검색해서 확인했..
보호기법으로 RELRO, CANARY, NX가 걸려있다 got overwrite는 못한다. main함수이다. Malloc함수를 보겠다. malloc의 갯수가 6개이상이면 exit가 진행된다. 전역변수 ptr에 주소가 저장된다. 입력받은 수가 0과 5사이어야 exit가 실행이 안된다. index를 입력받아 해당위치의 heap데이터를 확인할 수 있다. 음수의 대한 처리가 없다. 여기서 주소들을 leak할 수 있다. 하지만 여기서 got의 주소를 바로 참조해버리면 안된다. puts의 인자가 값을 한번 역참조하기때문이다. ELF64_Rela를 사용하기로 한다. 0x4005a8주소의 데이터로 puts의 got값이 들어가 있다. 위치를 계산하여 가젯들을 계산한다. got overwrite가 불가능하기에 one_ga..
fget의 인자들을 본다. rbp-0x10의 값이 입력값을 저장하기 위한 주소로 받는다. pop rbp; ret; 가젯을 이용해 .bss영역으로 수정해준다. 그 후 다시 main으로 ret을 한다. bss영역을 낮게 잡았더니 실행이 되지 않았다. 넓게 잡아주었다. system함수를 이용해 실제주소를 leak하는 방법도 있다.
내가 원하는 사이즈로 malloc할당이 가능하며 지울 수도 있다. 출력 및 업데이트가 가능하다. 0번 메뉴인 malloc을 할당하는 함수이다. 내가 원하는 size로 malloc을 할당하고 0x80크기의 malloc이 또 하나 할당된다. 내가 입력한 size malloc : text 0x80 크기의 malloc : name name안에 text의 주소가 들어 간다. 전역 변수 store에 name의 주소가 들어간다. 1번 메뉴이다. 초기화한 후 0을 넣는다. store변수를 통해 값을 출력한다. update_desc함수이다. 조건문을 지나고 입력을 받는다. 조건문은 overflow를 방지한 듯하다. 힙을 할당받은 상태이다. 두 번 할당받은 상태이다. 여기서 0번 인덱스를 free 하고 0x80 크기를 할..