-
[HackCTF] ROP Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 24. 00:47
이번 문제는 ROP이다. 제목 그대로 아주 기본적인 ROP였다.그래서 처음 접한다면 어려울 수 있으나 한번이라도 ROP를해봤다면 굉장히 쉬운 문제가 될 것이다. 역시 문제 제목이 ROP라 그런지 Partial RELRO였다. 즉, Got Overwrite가 가능했고 NX가 걸려있으므로Stack이나 Heap 영역에 실행권한이 없는 상태이다. 우선 문제를 실행시켜보았다.사용자로부터 입력을 받았고 입력 후에는"Hello, World!"라는 문자열을 출력해주었다. 여기까지 진행했을 때 이 입력하는 부분을공략하게 될 것이라고 예측했다. 아니나 다를까 굉장히 친절하게도 이 문제에서는대놓고 함수명이 취약한 함수였다ㅋㅋㅋ 해당 함수를 보니 예상한대로 입력하는 부분이 존재했고버퍼보다 큰 값을 입력할 수 있었다. 이 부분..
-
[HackCTF] RTL_Core Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 23. 18:10
이번 문제는 RTL_Core 입니다. 해당 바이너리는 NX만 걸려있다. 문제를 실행시켜보면 패스코드를 입력하라는문자열이 출력된다. 그래서 뭔가 입력해보았는데정답이 아니기 때문에 분석을 통해서 정답을 맞춰야했다. IDA를 이용해서 코드를 보도록 하자.hashcode를 맞춰야 다음단계로 넘어갈 수 있다. hashcode는 0x0C0D9B0A7 이라는 것을 확인했다.우리가 입력한 값은 check_passcode함수의 인자로 넘어가고거기서 계산된 값이 바로 위에서 찾은 hashcode와 같아야한다. 그럼 check_passcode함수를 보도록 하자.동작원리는 간단했다. 기준이되는 메모리부터 4바이트씩커진 위치의 메모리 위치(+4, +8, +12, +16)의 값을 읽었고그 값들을 계속해서 더한 값이 바로 hash..
-
[HackCTF] Random Key Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 22. 18:33
이번 문제는 Random Key이다.굉장히 많이 삽질하고 고생도 많이했다.ㅠㅠ 이 바이너리는 64bit였으며 NX가 걸려있었다. 프로그램을 실행해보면 아래와 같은 화면이 출력된다.무언가 Key값을 입력하도록 되어있는데 맞추지 못해서 "Nah..."가 출력되었다. IDA를 이용해서 소스코드를 보도록하자.v3는 time함수의 return 값을 받고 있는데 time함수는 null을 넘기면1970년 1월 1일 0시 이후 부터 현재까지 지난 시간을 '초' 단위로 return해준다.(time함수에 null이 아닌 인자값을 준다면 인자값까지 흐른 시간이다. ) time 함수가 return한 값을 srand 함수에 넘겨주어서 난수를 초기화 시켜주고 있었다즉, 현재까지 흐른 시간(초)을 이용하여 난수를 초기화한 뒤 ra..
-
[HackCTF] BOF_PIE Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 21. 19:39
이번 문제는 BOF_PIE이다.포트번호를 보니 새로나온 문제인 것 같다.제목이 PIE인 것보니 Mitigation으로 PIE가 걸려있을 것 같다. 역시나 PIE가 걸려있었고 NX도 걸려있었다.NX의 경우 heap, stack, data영역에 실행권한이 없는 것이고PIE의 경우 코드영역을 포함한 모든 영역이 랜덤하게 매핑된다.하지만 PIE는 Base주소만 달라지기 때문에 우리는 offset을이용하면 이 문제를 해결할 수 있을 것이다. 바이너리를 실행시켜 보았다."j0n9hyun을 아느냐"는 문자열이 출력되었고 j0n9hyun의 주소가출력되었다. 다음으로는 사용자로 부터 입력을 받았고 나는 "abcdefg"를 입력하였다. 그러자 "Nah..."라는 문자열이 출력되었다. 당연히 함수로 예측되는 j0n9hyun..
-
[HackCTF] RTL_Wolrd Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 21. 17:33
이번 문제는 RTL_World이다.제목에서 볼 수 있듯이 RTL을 이용해야 할 것만 같다ㅎㅎ 우선 프로그램을 실행해보았다. 뭔가 돈을 벌어서 Binary Boss를 죽이는 게임인 것 같고돈을 벌 수도 있고 돈을 통해 Shell Sword와 System Armor을구입할 수도 있는 것 같다. 우리가 입력할 수 있는 부분은메뉴선택과 Binary Boss를 Kill하기위한 Attack 부분이다.그러므로 이 부분을 이용하여 공격을 진행하면 될 것 같다. 소스코드를 보도록 하자~코드를 보게되면 우리가 입력할 수 있는 버퍼가 보이고 아래쪽 즉 Binary Boss를 kill 하기 위한 부분을 보면 read함수를 이용해서 입력을받고 있는데 이 부분에서 BOF를 일으킬 수가 있게된다.버퍼보다 더 큰 크기를 입력 할 수..
-
[HackCTF] Offset Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 19. 23:48
이번 문제는 Offset이다~ 지금까지의 문제와는 다르게 처음으로 Mitigation이 걸려있다.RELRO가 FULL이기 때문에 write권한이 없어서 Got Overwrite를진행할 수 없고 PIE와 NX가 걸려있기 때문에 Code영역을 포함한모든영역이 랜덤하게 매핑되며 data, stack, heap에 실행권한이 없다. 코드를 보도록 하자~코드를 보면 gets함수를 이용해서 s 버퍼에 값을 받고그 s 버퍼를 인자로 select_func 함수를 호출한다. select_func 함수를 보도록 하자. v3를 보게되면기본적으로 two함수의 주소를 받고 있다. 만약 s 버퍼에입력한 값이 "one"이 된다면 v3의 값은 one 함수의 주소가 된다.그러므로 우리는 이 호출되는 v3의 주소를 우리가 원하는 주소로 ..
-
[HackCTF] Simple_Overflow_ver_2 Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 19. 03:41
이번 문제는 Simple_Overflow_ver_2이다!! 문제를 실행시켜보면 "Data: " 라는 문자열이 출력되면서입력을 받는다. 입력한 문자열과 함께 주소값이 출력되는데이 주소값은 버퍼의 주소값으로 보여졌다. 이 주소값은 프로그램이 실행될 때마다 달라진다. 또한 16자리가 넘어가면줄이 넘겨지면서 다음줄의 주소값이 나타나게 된다. "Again" 이라는 문자열이 출력되고 "y"를 입력하여 다시 진행하게되면 처음 입력받은 버퍼의 주소에 계속해서 입력을 받는다는 것을 알 수 있었다. IDA를 이용하여 소스코드를 보도록 하자예상했던대로의 코드 흐름임을 알 수 있었다~~ 그렇다면 Paylaod를 짜는 것은 간단해졌다. 우리가 필요한 것은이제 ret의 위치만 알면 Payload를 완성시킬 수 있다."a"를 4개..
-
[HackCTF] x64 Simple_size_BOF Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 18. 21:48
이번 문제는 x64 Simple_size_BOF이다~~ 문제를 실행시켜보았다!버퍼의 주소로 보이는 것이 출력되고 있고사용자가 값을 입력할 수 있게되어있다~ 소스를 보도록 하자버퍼의 크기는 0x6D30 => 27952이다. 프로그램을 실행해보면 알겠지만버퍼의 주소는 항상 바뀐다. 하지만 버퍼의 주소를 출력해주기 때문에우리는 버퍼의 주소를 알 수 있다. 그렇다면 일단 ret위치를 확인해보자 rsp에서 27960떨어진 부분이 바로 ret값이다. 그러므로 우리는다음과 같은 Payload를 구성할 수 있다. Payload는 다음과 같다~우선 출력되는 버퍼의 주소값을 인자로 받아온다. 받아온 이 버퍼의 주소는ret에 덮어쓸 것이다. 그 다음 64bit용 Shellcode(31)을 넣고 나머지 27929만큼을dumm..
-
[HackCTF] x64 Buffer Overflow Write-up표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 18. 16:57
이번 문제는 x64 Buffer Overflow이다.이전에 풀어봤던 문제와 흡사하며 64bit라는 차이점을 가지고 있다. 프로그램을 실행시켜보면 내가 입력한 값과 hello라는 문자열이 출력된다. 코드를 보도록 하자.누가봐도 이 부분에서 BOF를 일으킬 수가 있다. (길이제한이 없음) 그러므로 간단하게 풀 수 있는데 그렇다면 쉘은 뭘로 딸까??이전에 이러한 비슷한 문제가 있었기 때문에 바로 함수를 확인해보았다.ㅋㅋㅋ역시나 사용하라고 준비한 의심스러운 함수가 존재했다. 해당 함수는 역시 execve 함수를 호출하고 있었고 ㅎㅇ 하고 "/bin/bash"를 인자로 받고 있었다. IDA를 이용해서 한번 더 확인해보았다. 확신을 할 수 있었기 때문에이제는 ret를 찾아서 callMeMaybe 함수 주소로 덮어씌..
-
[백준] 퇴사 14501알고리즘/백준 BAEK JOON 2019. 4. 18. 03:53
이번 문제는 퇴사이다.https://www.acmicpc.net/problem/14501 생각보다 어려웠는데 그 이유는 아직 재귀함수를 잘 못다루는 것 같다ㅎㅎ 이런 문제는 문제를 풀기전에 어떻게 설계하느냐에 따라 달라지는 것 같다.(사실 모든 문제가 그렇다 ㅎㅎ..) 재귀함수에 대한 문제를 조금 더 풀어봐야겠다. 우선 day와 pay를 나란히 입력받는다.그 뒤 함수를 호출할 것인데 이 때 들어가는 인자는 sum과 idx이다. idx가 입력받은 n과 같아지면 정상종료되야한다고 판단하며문제에서 최대이익을 원했으니 sum과 ans중 최대값을 비교하여 ans에 저장한다. n보다 idx보다 커질 경우 상담을 할 수 없는 것이기 때문에이 경우에도 종료시키는 것이 맞다. idx==n이 되지 않았다면 방금 상담한 날..