목록Wargame & CTF/Pwnable (26)
메로나

NX가 활성화 되어 있기 때문에 쉘코드는 사용할 수 없고, ASLR이 켜져있어 매번 함수의 주소가 임의로 할당된다. IDA로 한번 보도록 하자. 이 외에 j0n9hyun이라는 함수가 있는데, 이 함수는 플래그를 출력하는 함수이다. welcome 함수는 welcome 함수의 주소를 알려주고 v1에 scanf 함수로 데이터를 받아온다. 입력값 크기 필터링을 안하므로 버퍼 오버플로우가 가능하다. welcome 함수의 주소를 알고 있고, j0n9hyun 함수와의 오프셋을 알고 있다. PIE 가 활성화 되어 있다 해도 함수의 오프셋은 바뀌지 않으므로 j0n9hyun 함수의 주솟값을 알 수 있게 되는 것이다. 익스플로잇 코드는 아래와 같다. 실행해 보면, 지금 라이트업을 쓰는 시점에 3008번 포트에 yes_or_..

어떤 보호기법이 걸려있는지 보자. 카나리를 제외한 모든 보호기법이 걸려있다. ASLR이 활성화되어 있기 때문에 프로그램을 실행할 때 마다 함수의 주솟값이 임의로 바뀌게 된다. 메인 함수를 Hex-Ray로 보면, gets함수로 s에 불러오고 싶은 함수의 이름을 받아오고, select_func 함수를 이용해 그 함수를 불러오는 것 같다. select_func 함수를 Hex-Ray로 보면, v3에 처음엔 two를 넣고, dest에 처음 받아온 s를 31바이트 복사해온 다음 dest가 one이라면 one함수를 불러온다. dest와 v3의 offset이 2A - C = 30인데 dest에는 총 31바이트를 받아올 수 있으므로 v3의 마지막 1바이트를 임의로 조작할 수 있다. 다시 프로그램으로 돌아가 심볼을 한번 ..

문제의 바이너리 파일을 Hex-Ray로 보면 위와 같다. 이 문제에는 보호기법이 적용되어 있지 않으므로 shellcode를 사용가능 하다. Data를 scanf로 s에 받아오고, s의 주솟값과 s에 어떤 값이 있는지 보여준 뒤 이걸 반복한다. 프로그램을 실행한 후 프로그램이 돌아가는 동안은 s의 주소가 일정할 것이다. 그러므로 시나리오를 작성해 보면 1. 먼저 데이터에 아무 값이나 집어 넣어 s의 주솟값을 알아낸다. 2. shellcode를 이용해 버퍼 오버플로우를 하고, ret에 buf의 주소를 넣어준다. 이렇게 되겠다. 익스플로잇 코드는 Shellcode(25) + Dummy(0x88 - 25) + SFP(4) + RET(buf_addr) 이 되겠다. 이를 바탕으로 파이썬 코드를 작성해 보면 아래와 ..

먼저 바이너리 파일을 Hex-Ray로 까보면 위와 같다. v4의 위치를 알려주고, gets함수로 v4에 값을 받아오는데, gets함수는 버퍼의 크기에 상관없이 값을 받아오기 때문에 버퍼 오버플로우 취약점이 터지게 된다. 보호기법이 적용된 것이 없기 때문에, shellcode를 사용할 수 있다. 버퍼 크기가 0x6d30이므로 익스플로잇 코드는 Shellcode(23) + Dummy(0x6d30 - 23) + SFP(8) + ret(address of buf) 가 되겠다. 파이썬으로 짜보면 아래와 같다. 실행해보면, 풀리는것을 볼 수 있다 ~_~

헥스레이를 안봐도 된다... 해석해보면, 두개의 정수를 입력받고 먼저 0x1336보다 두 값이 작거나 같은지를 보고, 만약 0x1336보다 작거나 같으면 loc_8C5로 점프한다. 첫번째 인자에서 두번째 인자 값을 빼서 0x1337과 값이 같다면 flag값을 받아오는 형식이다. 근데 음수값 필터는 하지 않는다. 그래서 그냥 첫번째 인자에 4918, 두번째 인자에 -1을 넣으면 바로 flag를 받아온다. 굳이 익스플로잇 코드는 필요 없으므로 바로 해보면, 플래그가 나온다. 이 문제는 헥스레이 안보시는걸 추천드립니당 ~_~

어셈블리 해석이랑 디버깅 능력을 키우기 위해 pwnable.xyz 초반 문제를 풀어보았다. 초반 문제 몇 개들이 정말 어셈블리 처음 보고 디버깅 연습할 때 정말 좋았던 것 같다. 먼저 그냥 실행해 보도록 하자. 어떤 주소값을 Leak 해 주고 메시지의 길이와 메시지를 받아 오는 프로그램이다. 보호기법을 확인해보면, 모든 보호기법이 활성화 되어있다... 익스 방법을 생각해보기 위해 IDA로 먼저 보도록 하자. 먼저 v3에는 malloc으로 0x40000만큼 동적할당을 해주고, v3의 주소를 먼저 Leak 해주고 있다. 그다음 size 변수에 메세지의 길이를 저장하고, v5에 malloc 함수로 size 만큼 동적할당을 해준 뒤, v5[size-1]를 0으로 만들어주는 과정을 거친 후, v3가 0이 되어야 ..

64비트 버퍼 오버플로우다. 먼저 IDA로 보면, scanf 함수로 값을 받아오고 printf함수로 출력하는 간단한 함수이다. scanf함수에서 버퍼 오버플로우가 터질 것을 알 수 있다. 또 callMeMaybe라는 함수가 있다. 보면, /bin/sh를 실행해주는 고마운 함수이다. 그러면 Dummy (0x110) + SFP (0x8) + callMeMaybe 이렇게 페이로드를 짜도록 하면 된다. 코드는 아래와 같다. 실행해 보면, 성공적으로 쉘을 딴 것을 알 수 있다.

4번째 문제인 버퍼가 흘러넘친다는 문제이다. 먼저 파일을 받아 어떤 보호기법이 적용되어있는지 보도록 하자. 오잉? 아무 보호기법도 적용되어 있지 않다. 그러면 쉘코드를 사용할 수 있다는 말인데... 일단 IDA로 까보도록 하자. read 함수로 name변수에 값을 받아오고, gets 함수로 v4에 인풋값을 받아오는 것을 알 수 있다. name의 영역을 먼저 살펴보면, 보이는가? name은 bss영역에 존재하는 것을 알 수 있다. 그러면 shellcode를 name에 넣어 주고, 밑의 인풋값에서 버퍼 오버플로우를 한 뒤 name의 영역에 있는 쉘코드를 불러와주면 될 것이라는 것을 알 수 있다. 익스플로잇 코드는 아래와 같다. 실행해 보면, 성공적으로 익스플로잇이 된 것을 알 수 있다.