일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 윈도우 커널 드라이버
- C언어 패킷캡쳐
- Network Byte Order
- windows kernel debugging
- 네트워크 바이트 오더
- 포너블
- pcap packet capture
- apphelp.dll
- vcruntime.dll
- Windows Kernel Driver
- Windows Kernel Debug
- HackCTF
- hacking
- packet capture
- 윈도우 커널
- arudino
- pcap packet
- Windows Kernel
- 바이트 오더
- pwnable
- 개발 환경 준비
- 윈도우 커널 디버깅
- Msvcrt.dll
- Windows
- vcruntime140.dll
- 해킹
- 시스템해킹
- 개발하기
- IAT Hooking
- ucrtbase.dll
- Today
- Total
목록2021/06/17 (4)
미친해커
리눅스 운영체제의 메모리 보호기법을 정리해볼 생각이다. (사실 나도 매번 까먹어서 정리가 필요함...) 리눅스에서 바이너리에 적용되어 있는 메모리 보호기법은 checksec을 이용하여 확인 할 수 있다. checksec [Bianry File] 커맨드를 입력하면 RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) 이렇게 현재 바이너리에 적용되어 있는 메모리 보호기법을 볼 수 있다. 보호기법 별 자세한 설명은 다음 글부터 할 생각이다.

IDA로 디스어셈블을 한번 해보자 이번에는 main 함수 외에 다른 함수는 보이지 않는다. 지역변수 s가 20 (0x14) 바이트 할당이 되어 있고 name은 전역변수로 BSS 영역에 할당되어 있다. gets 함수에서 Buffer OverFlow가 발생 main 함수의 ret 주소를 조작할 수 있을 것으로 보인다. 적용된 보호 기법을 확인해보니 바이너리에는 아무런 보호 기법도 적용되어 있지 않다. 그렇다는 건 바이너리 내에 모든 영역에 읽기, 쓰기, 실행 권한이 존재하며 주소도 변하지 않는다는 말이다. 위와 같이 read 함수가 실행되었을 때 shellcode 코드를 BSS 영역에 작성한다. 그 후 gets 함수에서 Buffer OverFlow를 발생시켜 main 함수의 ret 주소를 BSS (name)..

이번에는 FSB (Format String Bug) 문제이다. IDA를 이용해 디스어셈블해보자 vuln 함수가 정의되어 있는것으로 보인다. vuln 함수를 확인해보자 vuln 함수에서 fgets로 입력을 받고 입력받은 문자열을 snprintf를 이용하여 format으로 복사한다. 이때 Format String에 맞춰 format에 쓰여진다. 하지만 s에 받은 문자열에 서식문자가 있다면 Format String Bug가 발생한다. 만약 취약점이 발생하지 않도록 한다면 '%s' 서식문자를 사용해 format에 쓰면 된다. printf에서는 단순히 format에 쓰여진 문자를 출력한다. 이 외에도 flag 함수도 찾을 수 있다. 이번에도 flag 함수를 실행시키면 flag를 따낼 수 있을 것으로 보인다. 서식..
Format String이란 printf 계열의 함수를 이용할때 사용하는 특수한 형식의 문자열이다. 예를 들어 다음과 같은 C언어 코드가 있다고 하자 #include int main(int argc, char *argv[]) { char text[] = "Hello World!"; int i = 30; long h = 0xDEADBEEF; printf("%s %d %x\n", text, i, h); } printf 가변인자를 받고 서식문자에 맞춰서 인자로 들어온 데이터를 출력해준다. 출력 결과를 보다시피 '문자열 정수 16진수' 형태로 출력이 되었다. 각각 %s는 문자열(String), %d는 정수(Decimal), %x는 (heXadecimal) 를 나타낸다. 그렇다면 이것이 왜 문제일까? printf..