일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 바이트 오더
- 시스템해킹
- 포너블
- pcap packet
- 윈도우 커널 디버깅
- vcruntime.dll
- HackCTF
- Windows Kernel Debug
- Windows Kernel Driver
- Windows Kernel
- Windows
- C언어 패킷캡쳐
- Network Byte Order
- 윈도우 커널 드라이버
- 개발 환경 준비
- windows kernel debugging
- arudino
- Msvcrt.dll
- vcruntime140.dll
- pcap packet capture
- 해킹
- ucrtbase.dll
- IAT Hooking
- apphelp.dll
- hacking
- packet capture
- pwnable
- 네트워크 바이트 오더
- 개발하기
- 윈도우 커널
- Today
- Total
목록Hacking (14)
미친해커
이번에는 HackCTF의 첫 64Bit Pwnable 문제이다. 기존까지 IDA 32Bit를 이용해서 디스어셈블을 했지만 이번 문제는 IDA 64Bit를 이용해야 한다, (혹시라도 IDA가 없다면 어둠의 경로를 추천..) 그리고 지금까지는 생략했지만 앞으로 문제를 풀기 전에 checksec를 활용해서 꼭 보호기법을 확인하도록 하자 Full RELRO와 NX가 걸려있다. Full RELRO은 GOT Overwrite 기법을 사용할 수 없고 NX는 shellcode를 삽입하여 실행할 수 없다. main 함수이다. 처음에 scanf에서 Buffer OverFlow가 발생하는걸 확인했다. 그 후에는 별 다른 취약점이 발생하는 부분이 없어보인다. 아마 ret 주소를 덮어씌우는 문제로 보인다. 보통 NX가 걸려있으..
리눅스 운영체제의 메모리 보호기법을 정리해볼 생각이다. (사실 나도 매번 까먹어서 정리가 필요함...) 리눅스에서 바이너리에 적용되어 있는 메모리 보호기법은 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..
버퍼란 프로그램상에서 할당된 메모리 공간을 뜻한다. 버퍼오버플로우란 메모리 관리로 인해 발생하는 취약점이다. 예를 들어 다음과 같은 C언어 코드가 있다. #include int main(int argc, char *argv[]) { char s[32]; int v1 = 10; printf("입력해주세요 : "); gets(&s); // Buffer OverFlow 발생 printf("s : %s\n", s); printf("v1 : %p\n", v1); } 위 코드를 보았을 때 별다른 문제가 없어 보이지만 사실 큰 취약점이 존재한다. gets 함수에서 Buffer OverFlow가 발생하는데 그 이유는 다음과 같다. gets 함수는 NULL 문자가 나올때까지 문자열을 받아 버퍼에 저장한다. 만약에 위..