![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQRhfJ%2Fbtq1visUTXk%2FkY9OoQNreahGEYIekL3Nyk%2Fimg.png)
[HackCTF] RTL_Core
2021. 3. 31. 22:11
Wargame/HackCTF
1. 문제 NX 비트가 걸려있음을 알 수 있다. 처음에 gets 함수를 통해 입력을 받는데, 입력받은 것을 check_passcode() 인자로 넘겨서 반환되는 값이 hashcode와 같을 경우 core() 함수를 실행한다. gets로 받은 인자(a1)를 반복문을 돌리는데, for 문을 통해 a1에 4씩 더하면서 4바이트 포인터로 형변환을 해준다. 그래서 a1부터 a1+16까지의 값을 누적시킨 v2를 반환해준다. (즉, for 문을 5번 반복하면서 전달받은 주소값을 기준으로 4bytes 씩 증가시켜 순차적으로 접근하여 해당 값들을 v2 변수에 더하여 반환한다.) 이때, v2는 hashcode의 값( 0xC0D9B0A7 ) 과 같아야 한다. 값을 같게 할 방법은 두 가지 정도 있다. 1) hashcode ..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH1XDn%2Fbtq1m6r4Llj%2FjeYKoGJWLVlAGo4LnkMLIk%2Fimg.png)
[Pwnable] Lazenca - ROP(x64) 정리
2021. 3. 30. 01:35
Hacking/Pwnable
Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. 각 가젯은 일반적으로 반환 명령어(ret)로 끝이나며, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브 루틴에 있다. Gadgets - POP; POP; POP; RET x86의 경우 pop 명령어..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDCQ4M%2Fbtq1pzUoBAE%2FTdns7NrQTSYyTDFLsKU3BK%2Fimg.png)
[Pwnable] Lazenca - ROP(x86) 정리
2021. 3. 29. 19:23
Hacking/Pwnable
Return Oriented Programming(ROP) -x86 ROP( Return-oriented programming )란? 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. Gadgets - POP; POP; POP; RET ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것이다. 01.RTL(R..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPCpDH%2Fbtq1beRHaDx%2FPhbkPe5uZrkDXz8B149Yk1%2Fimg.jpg)
[P4C] C언어 코딩 도장 : UNIT 54 ~ UNIT 55
2021. 3. 28. 19:33
Programming Languages/C
Unit 54. 공용체 사용하기 공용체는 구조체와 정의 방법이 같지만 멤버를 저장하는 방식이 다르다. 구조체는 멤버들이 각각 공간을 차지하지만 공용체는 모든 멤버가 공간을 공유한다. 54.1 공용체를 만들고 사용하기 공용체는 union 키워드를 사용하여 정의한다. union 공용체이름 { 자료형 멤버이름; }; 공용체는 정의만 해서는 사용을 할 수가 없다. 따라서 공용체도 변수로 선언해서 사용한다. union 공용체이름 변수이름; #define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include #include // strcpy 함수가 선언된 헤더 파일 union Box { // 공용체 정의 short candy; // 2바이트 float sn..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FydEBS%2Fbtq1haOccJc%2FiNqG3gEz1Cqqu7shwQ0uh1%2Fimg.jpg)
[P4C] C언어 코딩 도장 : 문제 풀이 7
2021. 3. 28. 17:27
Programming Languages/C
51.6 심사문제 : 암호화 헤더 크기 구하기 문제 : 다음 소스 코드를 완성하여 12가 출력되게 만드세요. 구조체 멤버의 이름은 마음대로 지어도 됩니다. 정답 : #include struct EncryptionHeader { char flags; int version; int number; }; int main() { struct EncryptionHeader header; printf("%d\n", sizeof(header)); return 0; } 51.7 심사문제 : 패킷 크기 조절하기 문제 : 다음 소스 코드를 완성하여 3이 출력되게 만드세요. 구조체 멤버의 이름은 마음대로 지어도 됩니다. 정답 : #include struct Packet { char a; char b; char c; }; in..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBzTPP%2Fbtq1at2KsQr%2FKG46D2KnaUCMHKIf7carN0%2Fimg.jpg)
[P4C] C언어 코딩 도장 : UNIT 51 ~ UNIT 53
2021. 3. 28. 16:48
Programming Languages/C
Unit 51. 구조체 멤버 정렬 사용하기 51.1 구조체 크기 알아보기 구조체의 전체 크기는 sizeof 연산자를 사용하면 알 수 있다. sizeof(struct 구조체) sizeof(구조체별칭) sizeof(구조체변수) sizeof 구조체변수 다음은 가상의 네트워크 패킷 구조체 PacketHeader를 정의해서 멤버의 크기와 구조체의 크기를 구하는 코드이다. #include struct PacketHeader { char flags; // 1바이트 int seq; // 4바이트 }; int main() { struct PacketHeader header; printf("%d\n", sizeof(header.flags)); // 1: char는 1바이트 printf("%d\n", sizeof(heade..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvRyk9%2Fbtq1jlbP82B%2FKAoC1cIih9iAnrsNceNuDK%2Fimg.png)
[FTZ] 해커스쿨 FTZ level 10
2021. 3. 26. 20:58
Wargame/Hackerschool FTZ
hint를 확인한 모습이다. 힌트에 따르면 공유 메모리를 사용하여 만든 프로그램을 도청하는 것이 문제 핵심입니다. 공유메모리란? 공유 메모리는 IPC(Inter-Process Communication)의 한 가지 방법으로 프로세스간 통신이 필요할 경우 사용합니다. 공유 메모리를 통한 통신은 둘 이상의 프로세스가 공통 메모리에 액세스 할 수 있는 개념으로 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있습니다. ipcs -m 명령어를 통해 공유 메모리 세그먼트에 대해 알 수 있습니다. key는 7530 byte이며, 크기는 1028 byte입니다. 이제 공유메모리에 접근해서 프로그램을 도청해봅시다. 공유 메모리를 사용하지 위해서는 아래의 헤더파일을 include 해주어야 합니다...
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNhH6%2Fbtq08vl7Tlw%2FSziEAU5Xz0B9meUPZV4sv1%2Fimg.png)
[FTZ] 해커스쿨 FTZ level 9
2021. 3. 26. 19:32
Wargame/Hackerschool FTZ
문제 힌트를 확인한 결과입니다. fgets 함수를 통해 buf에 입력을 받는데, buf의 크기인 10보다 큰 40 byte 만큼 입력을 받고 있습니다. 따라서 버퍼 오버플로우가 발생합니다. 이때 우리의 목표는 level 10의 권한으로 쉘을 실행시키는 것으로, buf2의 값이 "go"일 때 level 10의 권한으로 "/bin/bash"가 실행됩니다. 따라서 버퍼 오버플로우를 통해 buf2의 값을 "go"로 변경하면 될 것으로 보입니다. 그럼 이제 offset을 구하고 payload를 작성해보겠습니다. Offset 구하기 gdb를 이용해 디버깅을 해보겠습니다. 그런데 /usr/bin/bof 파일에 gdb를 실행시키니 permission denied가 뜹니다. 그래서 hint에서 주었던 소스 코드를 가지고..