[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 오류가..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwfh2q%2Fbtq2gX1nBYE%2FlSclo1qVrzU2q9fB0CbKL1%2Fimg.png)
[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 입니다. 오늘은 ..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmlXYH%2Fbtq2gwXivH1%2FTuAAYKaO18sOspO3yTVBFk%2Fimg.png)
[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로 입..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSa5qG%2Fbtq2gXABqUf%2FNwkjIDfTQCIdEGmuDnFAk0%2Fimg.png)
[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)하면 원래의 소스코드를 제대로 확..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsSRRG%2Fbtq1NtNR2XA%2FSrKxhXMs4nbK9yUkLXkfKk%2Fimg.png)
[codegate quals 2018] - BaskinRobins31(basic x64)
2021. 4. 4. 23:53
Wargame/etc
1. 문제 보호 기법을 확인해보니 NX bit만 걸려있는 상황이다. 파일을 실행해보니 말 그래도 basinrobins31 게임을 한다. my_turn 함수과 your_turn 함수를 살펴보도록 하자. your_turn 함수를 살펴보니 read 함수로 입력받은 부분에서 overflow가 발생함을 알 수 있다. 다음과 같이 해서 쉘을 획득할 수 있을 것 같다. 1. 쓰기 가능한 영역에 binsh 저장 2. write 함수로 read_got leak 시킴 3. leak된 주소 받아서 system 함수 주소 구하고, got overwrite 함 4. read 호출하면 system 함수 호출되서 쉘 획득 gadget 세개짜리 (ret) 인자 1 인자 2 인자 3 함수 호출 gadget 세개짜리 (ret) . . ..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc02mFT%2Fbtq1KA0FFi3%2FQBtiUSF3Nf4DmosdzxTQpk%2Fimg.png)
[pliadCTF 2013] - ropasaurusrex(basic x86)
2021. 4. 3. 21:40
Wargame/etc
1. 문제 NX bit 만이 걸려있음을 알 수 있다. NX bit + ASAL이 걸려있는 상황이다. 파일을 실행해보니 단순히 입력을 받고, "WIN"을 출력한다. 다음은 ida로 까본 모습이다. main이 상당히 심플하다. read 함수로 입력을 받는데, 버퍼 크기보다 더 크게 입력받아 overflow가 발생한다. 우리의 목표는 system 함수로 binsh을 실행시키는 것이다. 그런데, ASLR로 인해 system 함수, binsh의 주소를 모두 모르고 문제에서 주소가 leak 되지도 않는다. 이런 상황에선 어떻게 쉘을 획득할 수 있을까? lazenca rop x86에서 적용했던 기법을 생각할 수 있다. 일단 우리가 이용할 수 있는 것은 read, write 함수이다. -> gadget을 이용해 위 함..
![thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FubviG%2Fbtq1I7Evcm2%2FmhLoaVxoQtyzhmNeNI92f1%2Fimg.jpg)
[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..