워게임/CTFlearn

[CTFlearn] Simple bof - 포너블 / 버퍼오버플로우

SecurityMan 2023. 1. 9. 11:00

 

CTFlearn의 쉰네번째 문제

 

드디어 처음나온 포너블 문제이다.

 

포너블이라서 살짝 쫄았는데

 

이건 내가 봤던 포너블 문제중에서 가장 쉽고 친절한 문제였다.

 

반응형

 

문제 제목에 나온것처럼

 

문제의 목표는 버퍼오버플로우를 하는것이다.

 

 

먼저 문제에서 주어지는 bof.c 코드를 살펴본다.

 

크기가 16인 padding, 크기가 32인 buff 배열이 있고,

 

nonsecret에는 0xffffff00, secret에는 0xdeadbeef 라는 값이 각각 들어있다.

 

프로그램을 실행시키면 Input some text: 를 출력하면서 사용자의 입력을 받는데,

 

입력을 받을 때 입력값에 대한 길이를 검증하지 않기 때문에

 

버퍼오버플로우 취약점이 발생한다.

 

버퍼오버플로우로 secret 변수의 값을 0x67616c66 으로 덮어쓴다면

 

prinf_flag() 함수가 실행되어서 플래그를 출력하게 될 것이다.

 

 

0x67616c66 은 알파벳으로 바꾸면 galf 이다.

 

사실 근데 이건 리틀 엔디안 방식으로 적혀있는 거라 거꾸로 읽어야 한다.

 

거꾸로 읽으면 flag 이고, secret 변수의 값이 flag 가 되도록 하면 되는것이다.

 

 

nc 를 이용해 문제서버에 접속하면 이런 화면이 나온다.

 

친절하게 스택을 색깔표시까지 해서 보여주고 있다.

 

녹색은 buff, 주황색은 padding, 파란색은 nonsecret, 빨간색은 secret 이다.

 

만약 값이 변경되면 bold 체로 나타나게 된다.

 

 

Input some text에 aaaa 라고 넣어보았다.

 

그럼 아래 보이는것 처럼 61 61 61 61 이 스택의 buff 부분에 채워지게 되고,

 

bold 체로 표시된다.

 

이제 입력을 많이 넣어 오버플로우 시킨 뒤,

 

빨간색으로 써있는 ef be ad de (0xdeadbeef) 부분을 덮어써주면 된다.

 

 

갯수만 잘 맞춰주면 어려울게 없다.

 

입력값에 a를 40번 쓰고 뒤에 이어서 flag를 붙혀주면

 

보이는것 같이 ef be ad de 가 66 6c 61 67 (0x67616c66) 으로 변경되면서

 

조건문을 통과해 print_flag() 함수가 실행되게 된다.

반응형