전체 글

Pwnable/Tech

Stack pivoting

스택 피보팅이란 특정 영역에 값을 쓸 수 있거나 값이 있는 경우 SFP를 족쳐서 스택을 옮기고 해당 부분의 코드를 실행하는 기법이다. leave_ret 을 이용한 stack pivoting을 하기 위한 전제 조건 페이로드가 저장되어 있는 영역이 존재할 경우 ret까지만 overflow 가 발생 페이로드가 저장되어 있는 영역이 없는 경우 입력함수 + leave_ret을 넣을 수 있는 만큼 overflow 발생 일반적으로 stack pivoting을 사용하는 경우 overflow가 많이 나지 않ㄴ는 경우 main으로 돌아갈 수 없는 경우(seccomp 등) 익스 시나리오 SFP 부분에 실행을 원하는 주소 -8을 넣는다. (chain을 할 경우 예제 참고) 입력 함수를 RTL로 호출해서 bss영역에 값을 입력..

Pwnable/Tech

FSB 란 무엇인가

FSB printf 계열 함수 (snprintf 등), warnx와 같이 Fromat string을 사용하는 함수에서 발생하는 취약점 이다. 스택에 있는 값을 leak 할 수 있고, 특정 서식 문자를 이용해 AAW(임의의 주소쓰기), AAR(임의의 주소읽기) 할 수 있다. 스택을 릭하거나 덮어쓸 떄 주의 할점 이 있는데, 이는 6개의 인자를 레지스터에 먼저 저장하고, 그 이상의 인자를 스택에 저장 시키기 때문에 offset은 6이상이 될 수 밖에 없지만.,... 문제마다(사용하는 함수마다) 이는 다르다. 결국 AAAA. %x%x%x%x를 여러번 써 보면서 이 값 중 내가 첫번째에 입력한 값이 어느번째에 있는지를 파악하는것이 제 1관문, 즉 1 stage 이다. 포맷 스트링의 구조는 다음과 같다 ; %[p..

Windows

Windows Third-Party Privilege Escalation

보호되어 있는 글입니다.

Browser/Chrome

V8 Object and Their Structures (Star CTF 2019 OOB - V8 -- concept)

v8 엔진에서의 힙오버 힙오버는 특정한 8바이트를 읽거나 덮어쓰는 행위를 하는 부분에서 발생한다. 결국 임의의 읽기와 쓰기 를 가능하게 한다. (*v8 의 변수는 힙 영역에 존재) V8 Object and Their Structures V8 Objects List Objects 는 JS engine 에서 광범위하게 사용된다. v8 엔진에서는 v8 objects 가 있는데 이는 v8의 버전에 따라 조금씩 수정될 수 있다. V8 Objects List 보기 - 특정한 v8 버전에선 v8/src/objects.h, v8/src/objects/objects.h 에서 볼 수 있다. src/objects/objects.h - v8/v8.git - Git at Google Pointer to Backing Store..

Pwnable/Tech

house of lore 간단 설명

house_of_lore #include #include #include #include void jackpot(){ puts("Nice jump d00d"); exit(0); } int main(int argc, char * argv[]){ intptr_t* stack_buffer_1[4] = {0}; intptr_t* stack_buffer_2[3] = {0}; printf("nWelcome to the House of Lore\\n"); printf("This is a revisited version that bypass also the hardening check introduced by glibc malloc\\n"); printf("This is tested against Ubuntu 14.0..

Pwnable/writeup

pwnable.xyz message

해당 문제를 어떻게 풀어야하는지에 대한 지인의 요청으로 포스팅을 하겠되었습니다. 일단 해당 문제는 oob를 활용해 canary, pie leak 하는 문제입니다. 하지만 ret를 덮기위해 입력받는 함수가 scanf로, 해당 함수로 입력을 받는 다는 것입니다. 이에 다음과 같은 문자를 입력할 경우 그 위치에서 입력을 중단됩니다. \x09, \x0a, \x0b, \x0c, \x0d, \x20 이를 생각하고 leak 한 값을 가지고 ret 을 덮어 win 을 실행하려고 하면 이상한게 보입니다. 3바이트 주소중 두번째 바이트가 0xa 라는 겁니다. 이에 win으로 바로 ret를 줄 수 없습니다. ( 에전에 작성된 라이트업을 그냥 쓰면 안될 겁니다. pie_base 가 개행문자를 벗어날 수 있는 값이 나올때 까지..

Pwnable/writeup

Pwnable.tw - 3x17

gdb로 바이너리 분석해 보니, v4에 입력한 값을 전달한다는 것을 알 수 있다. 즉 sub_40EE70은 atoi이다. 실제로 문자 “ABCD”를 넣으니 필터링 된것을 알 수 있다. 즉 atoi 정수 형태의 문자만 입력받아 정수로 바꿔준다. int result; // eax char *v4; // [rsp+8h] [rbp-28h] char buf[24]; // [rsp+10h] [rbp-20h] BYREF unsigned __int64 v6; // [rsp+28h] [rbp-8h] v6 = __readfsqword(0x28u); result = (unsigned __int8)++loop_cnt; if ( loop_cnt == 1 ) { write(1u, "addr:", 5uLL); read(0, buf..

Pwnable/writeup

BDCTF - pwnrace

from pwn import * context.log_level = 'debug' context.terminal = ['urxvtc', '-e', 'sh', '-c'] context.arch = 'amd64' #context.arch = 'i386' ip = "159.223.101.241" port = 31337 p = remote(ip, port) file_name = "./pwnrace" libc_name = "pwnrace" #p = process(file_name) e = ELF(file_name) #libc = ELF(libc_name) def slog(name, addr): return success(": ".join([name, hex(addr)])) payload = b"hAcK_Th3_P..

Kon4
보안 공부하다, 적어보는 노트