본문 바로가기

Wargame/Pwnable.kr

Pwnable.kr passcode-10pt main() 함수를 보면 welcome() 함수와 login()함수를 차례로 호출한다. welcome() 함수에서 100byte 배열을 선언하고 최대 100byte 문자열을 입력 받아 배열에 저장, 출력한다. login() 함수가 중요한데, scanf() 로 passcode1, passcode2를 입력 받고 각각의 key값과 대조해 flag를 출력한다. 그런데 표시한 부분을 보면 scanf() 함수의 전달 인자로 포인터를 전달하지 않고 그냥 변수명을 넣었다. 현재 passcode1과 passcode2는 초기화 되기 전이므로 쓰레기 값이 들어있을 것이고 그 쓰레기 값을 주소로 삼아 해당 지점에 정수를 입력하려 할 것이다. 확인을 해보자. 위와 같이 코드를 작성하고 컴파일 한 뒤(컴파일 경고가 뜨긴한다.) .. 더보기
Pwnable.kr blackjack-1pt 이 문제의 가장 힌트는 "I like to give my flags to millionares." 다. ㅋㅋ "백만 장자에게 flag를 주겠다..." nc 접속을 해보면 위와 같이 간단한 blackjack 콘솔 게임이 실행된다. 1번 메뉴틑 게임실행, 2번 메뉴는 규칙, 3번 메뉴는 게임 종료이다. 처음엔 위와 같이 500달러가 주어지고, 베팅을 하고 이기면 베팅금액을 얻고 지면 뺏기는 카드 게임이다. 힌트 대로라면 100만 달러를 벌어야한다. 두가지 생각을 해볼 수 있다. 첫번째는 무조건 이기는 루틴이 있어서 그 루틴대로 계속이겨서 100만 달러를 모으는 것. 두번째는 (문제로 냈으니 뭔가있을테니까..) 한방에 100만 달러를 모을 수 있는 방법이 있다? 문제에서 주어진 URL을 가보면 blackjac.. 더보기
Pwnable.kr mistake-1pt 힌트로 준 'operator priority(연산자 우선순위)' 를 잘~ 생각하고 봐야한다. 표시한 두 부분을 보면 실제로 코드 작성자가 원하는 행동을 하지 않는다. '=' 연산자보다 '>',' 더보기
Pwnable.kr random-1pt random.c의 소스코드를 보면 표시한 두 부분을 봐야한다. random이란 변수에 rand() 함수를 이용해 무작위 정수를 넣고조건문에서는 사용자로부터 입력받은 key값과 XOR연산한 값이 0xdeadbeef가 되면 flag를 출력한다. rand함수 호출 직후 EAX 레지스터 값을 보면 0x6B8B4567이다. 근데 몇번을 다시 실행해도 RAX(EAX)의 값은 그대로 변하지 않는다. 왜냐! rand() 함수는 보통 무작위 값을 생성하기 위해 srand() 함수로 seed값을 설정해주는데.. 여기선 걍 rand()로만 받으니깐! 매번 같은 값이 튀어나온다는말이다 ㅋ 개쉽다. 익스 ㄱㄱ 고정된 랜덤값에 0xdeadbeef를 XOR연산해서 넣어주면 된다. 끝. 더보기
Pwnable.kr flag-7pt 바이너리를 받아보면 64bit 프로그램이고 static 컴파일되어 있다. 실행하면 힙 할당을 할 것이고 flag를 그곳에 복사해 넣을 거라는 문자열을 출력하고 종료시켜버린다. IDA로 문자열 검색을 해보면 'upx...'가 보인다. upx로 pack되어 있는 것 같다. 윈도우에서 upx.exe로 unpack 하자. unpack한 뒤 gdb로 분석이 가능해짐. 오른쪽 표시한 부분이 flag이고 힙 영역인듯 ㅋ.ㅋ flag 출력.. 끝임. 더보기
Pwnable.kr bof-5pt bof 문제다! gets() 함수는 걍 내맘대로 다 받아준다. overflowme 배열을 overflow시키고 변수 key의 값을 0xcafebabe로 수정해 쉘을 따면 된다. GDB-peda로 어셈을 보자. overflowme 배열은 ebp-0x2c(44)부터 시작하고 변수 key는 ebp+0x8에 위치한다. 총 52 byte의 dummy를 채우고 변수 key에 0xcafebabe를 넣어주면 조건 검사를 하면서 쉘을 실행해줄 것이다. 익스를 짜자. 익스.. 아주 아주 간단함. 쉘 따고 flag 굿~ 더보기
Pwnable.kr collision-3pt col.c 소스 코드의 중요한 부분은 위와 같음. check_password()함수의 반환값과 표시한 hashcode 값 0x21DD09EC와 같으면 flag를 출력해준다. argv[1]로 전달한 20 byte 짜리 문자열을 전달하고 이를 int형 포인터 변수로 가리켜 res변수에 5번 더해준다. 명시적 형변환과 char형 포인터 변수와 int형 포인터 변수의 차이점만 알면 아주 쉽게 풀 수 있다. 위와 같은 20 byte 배열을 int형 포인터 변수로 가리키게 되면... 이렇게 보이게 되것지... ip[0]부터 한칸씩이다. 익스 ㄱㄱ 간단하다. 걍 hashcode 나누기 5해서 더하며 끝... 나머지 있으므로 신경쓰면 됌.. flag 짜잔~~ 더보기
Pwnable.kr fd-1pt 문제는 위와 같다. File Descriptor가 무엇인지 묻는다. 위의 주소로 접속해보자. 접속하면 실행 파일과 flag 파일, 그리고 c언어로 작성된 실행파일의 소스코드가 있다.중요한 부분을 보자면 위의 표시한 부분들이다. 결국에 buf에 문자열 "LETMEWIN\n"을 박아넣으면 '/bin/cat flag'를 실행시킨다.따라서 read의 인자 fd는 0이 되어야 하고, fd가 0이 되려면 main함수에 전달되는 argv[1]의 값이 문자열 '4660(0x1234)'가 되어야 한다. 익스를 위와 같이 짜보자. 내 로컬 서버에 익스를 두고 싶어서 ㅋㅋ이렇게함. 풀었다. Flag 깔끔하게 출력함..ㅇㅇ.. 더보기