목록분류 전체보기 (101)
ipwn
Passcode문제이다. 읽어보니 컴파일 중 컴파일러가 경고를 했다는 것 같은데.. 한 번 서버 접속을 해보자. 코드를 읽어보니 이름을 받아오고 passcode1 == 338150, passcode2 == 13371337일 경우 플래그를 읽어준다. 하지만 이상한 점이 있다. scanf로 passcode1, passcode2를 입력 받는 부분을 보면 &연산자가 없다. 주소를 참조해서 변수에 입력을 하는 scanf인데, 변수의 주소가 아닌 그냥 passcode1, passcode2라는 변수를 넣었기에 그 변수의 값을 참조해 입력값을 받아온다는 것이다. 즉 이 곳에서 컴파일러가 경고문을 띄워줬다는 것을 알 수 있다. 만약 passcode1, passcode2의 변수에 원하는 주솟값이 있다면 그 주소안의 값을 ..
flag문제를 풀어보자. 이번 문제는 포너블문제가 아니라 리버싱 문제다. 글을 읽어보니 패킹이 되어있는 것 같다. 일단 binary파일을 받아보자. binary파일을 받고 ida로 연 뒤 바로 string을 보았다. string을 보니 UPX Packing이 되어있는 것 같다. UPX unpacking 툴을 다운받고 flag파일을 언패킹 해보자. 성공적으로 언패킹 된 것을 확인할 수 있다. 이제 ida로 언패킹 된 flag파일을 확인해보자. 분명히 아까보다 뭐가 많이 보일 것이다. 이제 string에서 한 번 flag를 찾아보자. 이렇게 언패킹을 마치고 난 뒤 string을 보게되면 flag가 대놓고 있다.
이번에는 nc서버 접속으로 푸는 문제이다. 코드를 보도록 하자. 간단한 Buffer Overflow로 해결할 수 있는 문제인 듯 하다. 대충 코드를 보면 key값이 0xcafebabe일 경우에 /bin/sh를 실행해준다. gets함수에서 overflow를 일으켜서 key 값을 0xdeadbeef에서 0xcafebabe로 바꿔주면 되는 문제이다. 사실 이미 알고계신 분도 계시겠지만 "0xcafebabe를 정확한 key값의 위치에 넣어라"가 아니라서 어처피 key값은 메모리 어딘가에 존재할테니 그냥 0xcafebabe를 적당히 많이 때려박아도 풀리는 문제이다. 하지만 이번에는 정확한 key의 위치에 0xcafebabe값을 한 번 넣어보도록하자. 일단 맨 처음의 링크에서 binary 파일을 가져와보도록 하자...
ssh서버에 접속해보자. 이제 서두 없이 바로바로 코드를 읽어보자. 코드의 flag를 읽는 부분을 보아하니 argv[1]의 값을 check_password함수에 집어넣어 나온 return값과 hashcode를 비교해 같은 값이면 flag를 읽어와 출력해준다. 그리고 값이 같지 않거나, argv[1]에 20byte크기가 아닌 값을 입력할 경우에는 종료시킨다. 이제 check_password가 무슨 함수인지만 확인해보면 확실히 flag를 읽어올 수 있을 것 같다. check_password함수를 보니 argv[1]의 값을 형변환을 해 4byte씩 5개 즉 20byte 크기의 int형의 배열로 만들었다고 볼 수 있다. 그 배열의 값들을 res에 순서대로 오차없이 한 개씩 더해주는 걸 확인할 수 있고 다 더한 ..
ssh 서버에 접속해보자. 이렇게 파일들이 나열된 것을 확인할 수 있다. fd는 fd_pwn의 권한으로 setuid가 걸려있고, flag 파일의 권한은 fd_pwn이다. 아마 fd파일을 실행하면 flag를 읽어와주거나 쉘을 가져올 수 있는 것 같다. 이제 fd.c를 열어보자. 코드는 이렇게 작성되어있다. 가장 중요한 flag를 읽는 부분을 보니 buf와 "LETMEWIN\n"을 비교, 같은 문자열일 경우에 flag를 출력해준다. 그 이전에는 fd의 값에 argv[1]을 받아와 atoi함수를 실행한 값에서 0x1234를 빼준 값이 들어간다. 그리고 밑 부분에는 read함수가 실행되는데 read함수의 원형은 size_t read(int fd, void *buf, size_t count); 위의 형태인데, f..
1. 포인터란? 포인터는 메모리의 주소 값을 저장하기 위한 변수를 의미합니다. 그러므로 (주소값 != 포인터) 포인터의 크기는 컴퓨터의 주소 체계에 따라 크기가 결정되는데요 , 32비트 기반 시스템에서는 4 바이트 크기 입니다. (64바이트 기반 시스템에서는 8바이트) 포인터 선언시에 사용되는 연산자는 * 인데, 자료형을 A로 하고 포인터를 선언한다고 하면 A *변수이름이 되는데 예를 들어 int *a; 라고 한다면 int형 a라는 이름의 포인터가 되는 것입니다. 즉 자료형A *b는 A타입의 b라는 포인터 변수가 생성되는 것입니다. 주소 관련 연산자(포인터)로는 &연산자와 *연산자가 있는데 & 연산자는 변수의 주소 값을 반환하는 연산자이고 * 연산자는 포인터가 가르키는 메모리를 참조하는 , 즉 직접적으로..
codeup1602.절대값 구하기 123456789101112131415#includedouble absolutevalue(double n1) { if (n1 line) { return 0; } else { starh(star); printf("\n"); return output(star + 1, line); }}int main() { int input, star = 1; scanf("%d", &input); output(star, input); return 0;}Colored by Color Scriptercs 이 코드는 반복문의 이해를 위한 공부를 할 때 배웠던 별찍기를 재귀함수로 구현해 낸 코드입니다. 이 코드의 동작 방식은 맨 처음 별을 몇개 찍을지 starh함수로 정하는데, n에 대입 된 값 ..
포인터로 swap함수 구현 포인터로 스왑 함수를 구현하라면 아래와 같이 구현 할 수 있는데요, 12345678910111213141516171819202122#includevoid swap(int *n1, int *n2) { int temp; temp = *n1; *n1 = *n2; *n2 = temp;}void swap2(int n1, int n2) { int temp; temp = n1; n1 = n2; n2 = temp;}int main() { int a = 7, b = 9; printf("a=%d b=%d\n", a, b); swap2(a, b); printf("a=%d b=%d\n", a, b); swap(&a, &b); printf("a=%d b=%d\n", a, b); return 0;..
1.포인터의 개념 포인터는 어떠한 메모리 값의 주소를 저장하는 변수를 의미 합니다. 쉽게는 데이터의 위치를 가르켜주는 것 입니다. 예를 들어 , 맛스타는 1200원이라는 메모리 값 주소값은 학교의 매점이고, 다른 편의점 CU에 있는 1200원의 과자의 1200원이라는 메모리 값 주소값은 CU인 것 처럼, 이렇게 같은 메모리 값이라도 주소는 각자 다 다르고 , 이 다른 주소를 저장해 주는것을 우리는 포인터라고 합니다. 2.포인터의 변수 선언 방법 1234567#includeint main() { int 맛스타=1200; int *ptr맛스타 = &맛스타; printf("%d원 짜리 맛스타의 주소는 %#x 입니다", 맛스타, ptr맛스타);}Colored by Color Scriptercs 이와 같은 방..
1.string.h 헤더파일 strlen,strcmp,strcpy이 세 함수를 사용하기 위한 헤더파일입니다. 당연한 말이지만 이 세 함수 말고도 더 많은 함수들이 포함되어 있습니다. 2. strlen함수strlen 함수는 한 문자열의 크기를 측정하는 함수입니다. 사용은 아래와 같은 방식으로 이뤄 집니다. 1234567891011#include#includeint main() { int howlong; char input[400]; gets_s(input); howlong = strlen(input); printf("input의 길이는 %d 입니다.", howlong); return 0;}Colored by Color Scriptercs 위 코드를 실행하면 아래와 같은 실행결과가 출력 됩니다. 띄어쓰..