pwnable.kr [bof] writeup

2019. 5. 1. 13:10System Hacking/pwnable.kr

안녕하세요!

오늘은 pwnable.kr

bof 문제를 풀어보도록 하겠습니다!




문제에 있는

소스코드는 아래와 같습니다!


맨 위에 func이라는 함수가 보이네요!

func의 인자로 key라는 인자가 들어갑니다!


그리고 overflowme[32]라는 

건방진?! 

버퍼가 있구요

gets함수로(취약한 함수)

overflowme 버퍼에 값을 씁니다!


주석에도 smash me라고 나와있듯,

gets 함수가 얼만큼 받을지

길이 제한이 안되기 때문에,


저희가 원하는 만큼 덮어 쓸 수 있습니다!


그리고 if 문으로

key 값이 cafebabe가 되었는지

확인을 합니다!


cafebebe인 경우 

shell이 획득되며,


cafebabe를 제외한 모든 값들은

모두 nah...(아니야..)를

출력하게 됩니다


main함수를 보니

fun함수에 0xdeadbeef를 key값으로 줬는데

문제가 풀리려면 

이 key 값이


0xdeadbeef -> 0xcafebabe로 변경되어야 합니다!


이 문제를 보고 들어야 하는 

기본적인 생각


통상적으로 함수의 인자는

ebp+8의 위치에 있습니다

(32 bit의 경우)


실제로 밑에 gdb에서 코드를 보셔도

cmpl $0xcafebabe,0x8(%ebp)

ebp+0x8이죠?


좀 더 이해를 돕기 위해서

func 함수가 로딩이 될 때를 보자면


[스택 상황]


overflowme[32]

ebp

ret_address

함수인자(0xdeadbeef)


한마디로 overflowme -->ebp---->ret_address----->함수인자 

까지 쭈욱 gets함수로 덮어 씌워서

0xdeadbeef를  0xcafebabe로 바꾸면

문제가 풀린다!


bof 파일을

gdb로 까서 보니 아래와 같네요!


func 함수는 

sub 0x48,$esp를 하네요!

(0x48=72)




그래도 일단은 직접 눈으로 확인하는게 좋으니!

func+35 부분에 

breakpoint를 걸고

실행을 시킵니다!


그리고 아래와 같이 4byte씩 끊어서

어떤 값이 확인되는지 봅시다!



string 형식으로 결과값을 출력하려고

x/s으로 하였구요

$ebp+8의 위치를 저희가 보고 싶은 거여서

x/s $ebp+8로 하였습니다!


근데 첫 4byte가 nnnn이니

nnnn전까지 몇byte인지를 확인해야겠네요!


알파벳 a~m까지가 13개!

각각 4개씩 넣어줬으니!


13*4=52개


52개 만큼의 더미를 채워주고 저희가 넣고 싶은

0xcafebabe를 넣어주면 문제가 풀리겠네요!



그래서 바로 아래와 같이 간단한 exploit code를 작성했습니다!


문자열 a를 52개 넣어준다 (더미)

그리고 0xdeadbeef 값을 덮어쓸

0xcafebabe를 입력한다(little endian)


이걸 bof의 input 값으로 주면

아래와 같이 exploit이 

완성되는 것을 확인할 수 있습니다!


고생하셨습니다!



'System Hacking > pwnable.kr' 카테고리의 다른 글

pwnable.kr [random] writeup  (0) 2019.05.03
pwnable.kr [collision] writeup  (0) 2019.05.02
pwnable.kr [fd] writeup  (0) 2019.04.29