[P4C] Pwnable problem 1
2021. 4. 10. 00:52
Hacking/Pwnable
1. 문제 #include #include #include void vuln(char src[]){ char buf[50]; strcpy(buf, src); printf("buf_addr : %p\n", buf); } void main(){ char src[100]; printf("Do you know Return to Shellcode?\n"); printf("Enter Please :)\n"); read(0, src, 100); vuln(src); } 다음과 같이 빌드해줍니다. gcc -o problem problem.c -fno-stack-protector -fno-pie -z execstack -mpreferred-stack-boundary=2 -m32 2. HINT segmentation 오류가..
[Pwnable.kr] 6번 random
2021. 4. 8. 23:54
Wargame/Pwnable.kr
먼저 rand 함수의 결과로 반환된 값을 random 변수에 저장한다. 그리고 scanf를 통해 입력받은 key값과 random 값을 xor 연산을 해 0xdeadbeef와 같은 값이 되면 system 함수가 실행된다. 그러면 어떻게 random 값을 유추해서 우리가 입력한 값과 연산해야할까? 사실 그럴 필요가 없다. rand() 함수의 경우 seed 값에 따라 다른 값들을 생성해낸다. 따라서 seed 값이 같거나 없을 경우 일정한 값을 만들어낸다는 의미가 된다. 참고 : [C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) (tistory.com) [C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성) 안녕하세요. BlockDMask 입니다. 오늘은 ..
[Pwnable.kr] 5번 passcode
2021. 4. 8. 19:57
Wargame/Pwnable.kr
우선 ssh로 접속하고 파일들을 확인해주었다. passcode 파일을 실행하니 이름을 입력받고, 입력받은 이름을 출력한 뒤 passcode1를 입력받는다. 그런데 아무 값이나 입력하니 segmentation falut가 발생했다. 그래서 passcode.c 소스 파일을 확인해보았다. main 함수, welcome 함수, login 함수 총 세 부분으로 나누어진다. welcome 함수의 경우 이름을 입력받아서 출력해준다. 이때 버퍼의 크기인 100 byte 만큼만 입력받아 ret를 변경해주진 못할 것으로 보인다. login 함수의 경우, passcode1과 passcode2를 입력받아 passcode들이 특정값과 일치할 경우 flag 파일을 보여준다. 그런데 이때, 한 가지 눈여겨 볼 점이 scanf로 입..
[Pwnable.kr] 4번 flag
2021. 4. 8. 19:50
Wargame/Pwnable.kr
리버싱 문제임을 알 수 있다. text view를 통해 봐도 어셈블리어가 정상적으로 출력되지 않는 것을 알 수 있었다. 일단 프로그램에 포함되어 있는 Strings에 대한 정보를 확인해보자. 따라서 [Quick View(Ctrl + 1)]을 확인하여, [Strings(Shift + F12)]를 열었다. 프로그램이 UPX(Ultimate Packer for eXecutable)를 이용하여 패킹되어 있다는 것을 알 수 있다. UPX는 다양한 파일 포맷을 지원하는 실행 파일 압축 프로그램이다. 실행 파일 압축을 하게 되면, 파일의 크기를 줄일 수 있으며 기본적인 리버싱을 방어할 수 있다. -> 이와 같이 패킹(Packing) 처리가 된 프로그램을 다시 언패킹(Unpacking)하면 원래의 소스코드를 제대로 확..
[P4C] C언어 코딩 도장 : UNIT 58 ~ UNIT 59
2021. 4. 3. 15:00
Programming Languages/C
Unit 58. 자료형 변환하기 58.1 기본 자료형 변환하기 자료형을 지정하여 변환하는 것을 명시적 자료형 변환(explicit type conversion, type casting)이라고 하며 변수나 값 앞에 변환할 자료형을 붙인 뒤 ( ) (괄호)로 묶어주면 된다. (자료형)변수 (자료형)값 #include int main() { int num1 = 32; int num2 = 7; float num3; num3 = num1 / num2; // 컴파일 경고 발생 printf("%f\n", num3); // 4.000000 num3 = (float)num1 / num2; // num1을 float로 변환 printf("%f\n", num3); // 4.571429 return 0; } num3 = nu..
[P4C] C언어 코딩 도장 : 문제 풀이 8
2021. 4. 3. 00:56
Programming Languages/C
56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기 문제 : 다음 소스 코드를 완성하여 15 127 7이 출력되게 만드세요. 정답 : #include struct Flags { unsigned int a : 4; unsigned int b : 7; unsigned int c : 3; }; int main() { struct Flags f1; f1.a = 0xffffffff; f1.b = 0xffffffff; f1.c = 0xffffffff; printf("%u %u %u\n", f1.a, f1.b, f1.c); return 0; } 56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기 문제 : 다음 소스 코드를 완성하여 57412가 출력되게 만드세요. 정답 : #include struct Fla..
[P4C] C언어 코딩 도장 : UNIT 56 ~ UNIT 57
2021. 4. 3. 00:29
Programming Languages/C
Unit 56. 구조체 비트 필드 사용하기 구조체 비트 필드를 사용하면 구조체 멤버를 비트 단위로 저장할 수 있다. CPU나 기타 칩의 플래그를 다루는 저수준(low level) 프로그래밍을 할 때 기본 자료형보다 더 작은 비트 단위로 값을 가져오거나 저장하는 경우가 많아 구조체 비트 필드가 유용하게 사용된다. 56.1 구조체 비트 필드를 만들고 사용하기 대부분의 컴파일러에서는 모든 정수 자료형을 사용할 수 있다. 보통은 비트 필드에 부호 없는(unsigned) 자료형을 주로 사용한다. 단, 실수 자료형은 비트 필드로 사용할 수 없다. 비트 필드는 다음과 같이 멤버를 선언할 때 : (콜론) 뒤에 비트 수를 지정해주면 된다. struct 구조체이름 { 정수자료형 멤버이름 : 비트수; }; #include ..
[Pwnable.kr] 3번 bof
2021. 4. 1. 17:31
Wargame/Pwnable.kr
func() 함수에서 gets 함수를 통해 입력을 받는데, 입력 크기를 지정하지 않아 버퍼의 크기인 32 byte 보다 더 입력을 받아 overflow가 발생하는 모습이다. 오버 플로우를 통해 key 값을 0xcafebabe로 바꿔주면 쉘을 실행할 수 있을 것이다. 그렇다면 offset을 구해보도록하자. func() 함수에서 두번째 call 하는 부분이 gets 함수가 실행되는 부분이다. 이때, overflowme를 인자값으로 주기 때문에 코드 위쪽을 보면 overflowme의 주소를 알 수 있다. ebp - 0x2c로 ebp로부터 44만큼 떨어져 있다. 따라서 offset은 44 + 4(SFP) + 4(RET) = 52이다. 따라서 payload는 다음과 같을 것이다. "A"*52 + "\xbe\xba..