[P4C] Pwnable problem 2
2021. 4. 10. 01:48
Hacking/Pwnable
1. 문제 #define _GNU_SOURCE #include #include #include void vuln(){ char buf[30] = ""; void (*read_addr)() = dlsym(RTLD_NEXT, "read"); printf("I'll give you some hint\n"); printf("read address : %p\n", read_addr); read(0, buf, 90); } void main(){ printf("do you know RTL?\n"); vuln(); } 다음과 같이 빌드해줍니다. gcc -m32 -fno-stack-protector -o problem problem.c -ldl 2. HINT NX bit + ASLR이 적용된 상황에서 어떻게 RTL 기법..
[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..