목록전체 글 (166)
Pwnstar

4번 flag라는 문제이다. 이렇게 바이너리 하나를 다운받을 수 있게 주는데, 리버싱 문제라네?? 이런 식으로 실행시켜보면 플래그를 malloc해서 strcpy로 넣어놓는다고 한다. 그거를 찾으면 되는건데.. IDA로 열어보니 이런 식으로 함수 네개만 주고 무슨 바이너리인지 도통 모르겠다...그래서 이 것만 뒤져보고 계속 고민을 해 보다가 upx~ 어쩌구 써있는 게 눈에 띄고, 리버싱 태스크라는 것도 기억이 나서 언패킹을 해봤다. 언패킹 성공 이 파일을 다시 IDA에 넣어 보았다. 이렇게 제대로 된 main 함수가 존재했다. flag라는 이름의 전역 변수가 있어서 혹시 이걸까?? 싶어서 봤는데 요게 플래그네... 끗!!

3번째 문제 bof이다. 이 문제는 다른 문제와 다르게 소스파일과 바이너리를 주고, nc로 연결해서 프로그램을 실행하게끔 되어있다. 우선 소스는 이렇게 되어있다. func함수에 0xdeadbeef를 인자로 주고, 32바이트 크기를 가진 overflowme를 overflow해서 key의 값을 0xcafebabe로 만들어주면 쉘이 따질 것 같다. 음 까나리가 걸려있는데 3번부터 까나리를 릭하는 문제가 나오려나..걱정하면서 func함수의 gets에 브레이크포인트를 걸고 실행해보았다. A 32개를 입력으로 줘 보았는데 저 밑에 0xdeadbeef가 보인다. dummy를 52개 주고, cafebabe를 입력으로 주면 될 것 같은데... 중간에 까나리가 있어서 찝찝하다. 일단 익스 코드를 짜 보았다. from pw..

pwnable.kr의 2번 collision이라는 문제이다. 이 문제도 fd와 마찬가지로 접속해서 보면 바이너리 하나, 소스파일 하나, flag파일이 하나 들어있다. 우선 소스파일을 살펴보면, 그리 길지는 않은데 조건문이 몇 개 보인다. 우선 실행할 때 인자를 하나 줘야할 것 같고, 인자의 길이는 20을 맞춰주면서 위에 정의된 hashcode와 인자로 준 값이 같아야 하는 것 같다. 그런데 위에 check_password 함수를 보면, 인자로 준 문자열 배열을 정수형 배열로 바꿔서 그 값들을 다 더해서 return해주는 것 같다. 그래서 0x21DD09EC를 5로 나누면 되지 않을까 해서 이 값을 5로 나눠보았다. 이렇게 값이 나오는데...5로 딱 떨어지지 않으니 마지막 값을 수정해서 줘 보자. 짠

pwnable.kr toddler's bottle을 올클했으니 이제 라업을 작성해보려고 한다. 참 오래 걸려서 기억이 가물가물한 문제들도 많지만 다시 풀어보기도 하면서 라업을 작성해보려고 한다. 우선 첫번째 문제 fd이다. fd 서버에 들어가면 바이너리 하나, c언어 소스파일 하나, flag파일 하나가 있다. 소스를 보면 argv[1]의 인자를 주지 않으면 프로그램이 종료되고, fd는 인자로 준 argv[1]를 int형으로 바꿔서 -0x1234한 값이 들어간다. 그 fd가 read함수의 파일 디스크립터로 들어가고, buf에 LETMEWIN이라는 문자열이 들어가 있으면 플래그를 볼 수 있을 것 같다. standard input은 0이므로 인자로 0x1234를 주고, LETMEWIN을 입력으로 주면 플래그를..

열번째 문제이다. 이전 문제들보다 훨씬 푸는데 오래 걸렸다.. 현재 문제풀던 환경이 16.04여서 ubuntu 18.04환경에서 따로 진행하였다. 64비트 바이너리이고, NX만 걸려있다. 우선 IDA로 열어보니 이전의 문제들과는 다르게 코드가 길었다. 일단 show me your number라는 문구와 함께 숫자를 입력하고, 조건이 맞춰지면 follow me가 뜬다. 만약 조건과 맞지 않으면 이렇게 뜨면서 종료된다. 이 숫자를 맞추기 위해서 처음에는 저 마지막 if 문 안에 있는 숫자를 유추하려고 했었다. 그런데 생각해보니 그럴 필요가 없는게 gdb에서 내가 입력한 숫자와 비교하는 부분을 보면 되는 일이었다.. 그래서 한번 시도를 해보았다. 해당 부분에 break point를 걸고 아무 수나 입력해보았다..

아홉번째 문제이다. 문제 이름 그대로 버퍼오버플로우인데 PIE가 걸려있는 게 아닐까 생각했다. 우선 32비트 바이너리이고, 역시나 NX와 PIE가 걸려있었다. 때문에 코드 영역을 포함한 모든 영역이 랜덤하게 배치된다. IDA 메인 함수에는 누가 봐도 수상한 welcome이란 함수가 있었고, j0n9hyun이란 함수는 flag를 열 수 있게끔 되어있었다. 메인함수가 시작되고 곧장 실행되는 welcome함수는 welcome 함수의 주소를 알려주고, 입력을 받는 형태로 되어있었다. 너무 당연하게 0x12 + 0x4 = 22만큼의 dummy 뒤에 j0n9hyun 함수 주소를 줄 수 있을 것 같았는데, PIE 때문에 함수의 base 주소가 매번 실행할 때마다 달라지기 때문에 이 base 주소와, j0n9hyun ..

여덟 번째 문제 우선 32비트이고, Full RELRO여서 GOT overwrite 불가능, NX 때문에 쉘코드 삽입 불가능, PIE 때문에 모든 섹션이 랜덤하게 재배치된다. IDA로 열어보면 메인함수는 어떤 함수를 call하겠냐는 질문과 받은 입력을 select_func에 인자로 준다. select_func 함수는 인자로 넘겨받은 입력을 "one" 문자열과 비교하여 같으면 one 함수를 실행시켜 준다. 함수 목록에 보면 one 함수, two 함수, print flag 함수 등등이 있는데 one 함수와 two 함수는 별것 없다 그냥 이 함수는 one 함수다 two 함수다 라는 것만 알려준다. 이제 이 함수로 어떻게 가느냐가 관건인것 같은데 처음 이 문제를 풀 때 너무 어렵게 생각해서 시간을 많이 잡아먹었..

일곱 번째 문제이다. 일단 오버플로우라고 하는 것 보니 버퍼 오버플로우겠지?? 이 문제는 다시 32비트이고, 아무런 보호기법도 걸려있지 않다. 음....이제 bof 문제가 하도 많이 나오다보니 단순한 문제가 아닐것 같긴한데 우선 IDA로 열어보겠다. 우선 쉘을 실행시키는 함수같은 것은 없었고 대충 입력을 받으면 그 입력을 받는 주소를 보여주고, 다시 입력을 받을 수 있는 구조인 것 같다. 이렇게만 봐서는 제대로는 모르겠어서 한번 실행해보았는데, s의 위치가 ebp-88h(136)이어서 136개 이상의 입력을 주면 segment fault가 뜰 줄 알았는데?? 뜨지 않았다. 그래도 뭐 eip를 덮을 순 있을테고, 버퍼의 크기도 136으로 충분한 것 같아서 이전 문제와 비슷하게 풀 수 있을 것 같았다. 버퍼..