전체 글

· TOOR
보호되어 있는 글입니다.
· TOOR
실행 생략.. 풀이과정 %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..
· TOOR
[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..
· TOOR
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..
· TOOR
배열의 범위를 벗어난 메모리에 접근할 수 있는 취약점 개발자가 인덱스에 대한 검사를 제대로 하지 않으면 발생한다. 임의 주소 읽기, 임의 주소 쓰기로 이어질 수 있다. 배열의 특징 배열은 연속된 메모리 공간을 점유한다. 이때 배열이 점유햐는 공간의 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이 된다. 배열이 포함하는 요소의 개수를 배열의 길이라고 부른다. dreamhack Memory Corruption: Out of Bounds 배열의 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형의 크기를 이용하여 계산한다. OOB OOB는 요소를 참조할 때, 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생한다. 개발자가 인덱스의 범위에 대한 검사를 명시적으로 프로그래밍하지 않으면, 프로세스..
· TOOR
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..
· TOOR
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..
· TOOR
PIE 에 대해서 얘기 하기 전에 PIC 에 대한 이해가 선행될 필요가 있다. What is PIC? Position Independent Code : PIC 위치 독립 코드 이 자체로는 보호 기술은 아니나 PIE를 이해하기 위해서 필요하다. PIC는 공유 라이브러리에 적용되는 옵션으로 공유 라이브러리 내 심볼들이 어느 주소에 로드되더라도 동작하는 코드이다. 주 기억 장치의 어딘가에 배치되어 절대 주소와 관계없이 모든 메모리 주소에서 수정없이 실행되는 기계 코드이다. 일반적으로 공유 라이브러리에서 사용되며, 동일한 라이브러리 코드는 각 프로그램의 메모리 영역에 로드 된다. 각 프로세서들은 PIC를 서로 다른 주소에서 실행할 수 있으며, 실행 시 재배치가 필요 없다. 공유 라이브러리를 만들 때 -fPIC ..
lmxx
lmxx