핵심.read 함수의 리턴은 eax 에 저장되고 이는 길이를 반환한다. 필요한 것 rao syscall; ret gadget 셸코드 or binsh 인데 binsh 삽입보다 셸코드 넣는게 더 가능성 높을 듯 sigreturn frame read Exploit method mprotect 를 호출해서 code 영역에 쓰기, 실행 권한을 부여한다. shellcode 를 삽입해서 실행한다. Attack Flow 우선 read syscall 을 하는데 mov edx, 0x130 으로 bof 가 발생하고 rao가 가능하다. syscall gadget 이 있는데 eax control gadget 이 없어 보이는데 read syscall 의 return 은 입력받은 문자열의 길이 이기 때문에 eax 를 조작할 수 있..
분류 전체보기
보호되어 있는 글입니다.
실행 생략.. 풀이과정 %6$p%7$p 했을 때와 tele -l 40 를 대조해서 보면 여기서부터 6번째다. 랜덤 값은 0xc8번쨰에 있으니 31번쨰다. 여기 값을 바꿔서 랜덤 비밀번호를 무효화 시킨다. %c%31$n 이렇게 하면 wyv3rn 이 아직 있다고 가라고 하는데 name 입력을 하면 0x10 번째에 생긴다. 처음에 %p 해서 스택 주소 알아낸 다음에 0x20 만큼 더해서 dsfsb 해서 wyv3rn을 바꿔버리면 될 거 같다. 이 wyv3rn 은 한글자라도 있으면 안된다. 그리고 name 부붕네서 wyv3rn 을 다시 써서 kind list 에 넣어줘야 한다. from pwn import * p = process("./chall") context.log_level = 'debug' sla = p..
[dreamhack]_rtld_global 프로그램 종료과정에서 사용된다. 직접 한번 보자 // Name: rtld.c // Compile: gcc -o rtld rtld.cint main() { return 0; } 실행을 해서 main 함수가 종료되는 부분부터 보면 __libc_start_main+231 로 리턴한다. 이후 내부에서 __GI_exit 를 call 한다. 계속 보다보면 __run_exit_handlers 함수를 호출한다. 함수의 코드 크기가 크기 때문에 라이브러리 코드로 봐야 한다. /* Call all functions registered with `atexit' and `on_exit', in the reverse of the order in which they were regist..
what is Race Condition 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과 값에 영향을 줄 수 있는 상태. 즉 공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 다음은 예시 코드이다. 예제 코드는 여기서 가져왔고 이후 설명도 해당 글에서 인용해왔다. #include #include int sum; void *run(void *param) { int i; for (i = 0; i < 10000; i++) sum++; pthread_exit(0); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, run, NULL); pthread_c..
배열의 범위를 벗어난 메모리에 접근할 수 있는 취약점 개발자가 인덱스에 대한 검사를 제대로 하지 않으면 발생한다. 임의 주소 읽기, 임의 주소 쓰기로 이어질 수 있다. 배열의 특징 배열은 연속된 메모리 공간을 점유한다. 이때 배열이 점유햐는 공간의 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이 된다. 배열이 포함하는 요소의 개수를 배열의 길이라고 부른다. dreamhack Memory Corruption: Out of Bounds 배열의 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형의 크기를 이용하여 계산한다. OOB OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생한다. 개발자가 인덱스의 범위에 대한 검사를 명시적으로 프로그래밍하지 않으면, 프로세스..
Format String Bug 개발자의 실수로 printf(buf) 이렇게 사용했을 때 입력 값을 포맷 스트링으로 넣으면 입력값을 문자로 취급하는게 아닌, 서식문자로 취급하여 취약점이 일어난다. #include int main(){ char str[0x10]; scanf("%s", str); printf("올바른 출력: %s\n", str); printf(str); return 0; } printf(str) 에서 포멧스트링 버그가 일어난다. str에 hello%x 를 입력하면 printf(str) = printf("Hello%x") 와 같은 동작을 한다. printf 함수는 가변 함수로 인자의 개수는 포맷 문자 개수로 결정된다. 포멧 스트링을 사용하는 대표적인 함수는 다음과 같은데 printf, spr..
RELocation Read-Only 메모리 보호 기법의 일종이다. What is RELRO 바이너리의 symbol 및 got 등에 보호기법을 거는 것을 말한다. RELRO 는 3가지가 있다. No RELRO, Partial RELRO, Full RELRO 취약한 순서대로 이다. Lazy Binding 를 하기 위해서는 프로그램이 실행되는 도중 GOT 에 라이브러리 함수의 주소를 덮어써야 한다. 즉, GOT에 쓰기 권한이 있어야 한다. No RELRO Partial RELRO Full RELRO 컴파일 방식 gcc -WI,-z,norlro gcc -Wl,-z,relro gcc -Wl,-z,relro, -z,now D.S에 BIND_NOW 포함 여부 X X O D.S에 JMPREL 포함 여부 O O X D..