본문 바로가기

Wargame Write-Up/HackCTF69

[HackCTF] (Pwnable) Basic_FSB 풀이 문제파일을 ida로 열어보면 main함수가 있다. main함수에는 특별한점이 없으니 vuln함수로 넘어가자 var_808 에 입력을 받고, snprintf로 var_408 에 400만큼 출력하고 printf 로 var_408 을 출력한다. 하지만 코드에는 이상한 점이 있다. 바로 (%s 나 %d 같은)서식문자를 사용하지않는점인데, 이점은 포멧스트링 버그(Format String Bug) 로 이어질 수 있다. 포멧 스트링 버그는 문자열을 입력받을때 사용자가 서식문자를 입력하면 그 서식문자에 따라 출력이 된다. 한번 문제서버에 서식문자를 입력해보자. AAAA %x %x %x %x 를 입력하면 그대로 출력되지않고 서식문자에 따라 16진수값들이 나오게된다. 이 16진수값들은 왼쪽부터 차례대로 스택에서 esp+4.. 2020. 3. 6.
[HackCTF] (Pwnable) Basic_BOF #2 풀이 먼저 문제파일을 아이다로 열어보면 입력은 ebp-8c 에 받고, ebp-c 를 호출하는걸 보면 ebp-c에 함수주소를 덮어써야 문제가 풀리는걸 직감적으로 알수있다. 그러면 무슨함수를 덮어써야할지 함수 리스트를 보는중에, 쉘함수를 실행시켜주는 shell 함수를 찾아냈고, 주소는 0x804849b 이다. 8C- C = 80h (128) 이므로 최종 payload = (python -c "print 'a'*128 + '\x9b\x84\x04\x08' ";cat) | nc ctf.j0n9hyun.xyz 3001 쉘을 얻고 cat flag를 할수있게된다. 2020. 3. 3.
[HackCTF] (Pwnable) Basic_BOF #1 풀이 hackctf에서 풀어보는 첫번째 포너블이다. 재밌겠다ㅎㅎ 문제파일을 ida로 열어봤다. 사진은 짤렸지만 fgets에서 stdin으로 입력을 받고, buf의 내용과 check의 주소를 출력해준다. check와 0x4030201을 비교하고 같으면 0xDEADBEEF와 비교한다. 그것도 같으면 you are on the right way ! 을 출력한다. 하지만 check가 두개의값을 동시에 만족할수는 없으니 눈속임에 불가하다. 두 값을 비교해 맞았든 틀렷든 loc_8048543 으로 이동하고 check와 0xDEADBEEF를 비교한다. 맞으면 Shell을 열어준다. GDB로 열어보면 버퍼의 주소는 EBP-0x34이고, check의 주소는 EBP-0xC이다. fgets로 입력받기때문에 버퍼오버플로우가 발생하.. 2020. 3. 3.
[HackCTF] (Reversing) Strncmp 풀이 문제를 다운받아 실행해보자 아무거나 입력하면 Always dig depper 이라 출력하고 종료한다. 항상 삽질하라는 충고같다. rsi, rdi (입력값) 을 인자로 주고있다. 그렇다면 rsi 를 확인해보자 main+188 에 BP 를 걸어 rsi 값을 확인해보자 이상한 문자열이 나온다. 이걸 입력해보면 Good game이라고 나온다. 하지만 이게 flag가 아니라는걸 알수있다. 힌트로 준것처럼 계속 삽질을 해보면 위에 나온 strcmp 함수 뒤에 _ 이 붙어 사용자가 작성한 함수인걸 알수있다. 한번 확인해보자 [loc_400712] 문자열에서 하나씩 값을 가져와 key와 xor 후 다시 s (사용자 입력 문자열) 에 덮어쓴다. (덮어쓰는것처럼 보이지만, gdb로 삽질하여 확인한 결과 값을 덮을려했지만 .. 2020. 3. 3.