level14
힌트를 보기위해 cat hint
crap과 check변수를 생성하고, buf를 20byte만큼 만들어준다.
fgets함수
이 소스에서는 fgets( buf, 45, stdin );처럼 쓰이는데 키보드(표준입력,stdin)로부터
최대 45글자 까지만 읽어와 buf에 저장한다.
이번 문제에서는 따로 쉘코드를 사용할 이유가 없는데 if문을 충족시켜주면
자동으로 권한을 상승해 쉘을 띄워주기 때문이다.
그렇다면 level13과 유사하게 check의 위치를 찾아서 0xdeadbeef를 넣어주면된다!!
check의 위치를 찾기위해 tmp폴더를 만들고 attackme를 복사해서 gdb로 들여다 보았다.
disassemble main
buf는 대략 56byte정도 할당해주고있다.
main+29를 살펴보면 ebp에서 -12만큼 뺀 곳에 0xdeadbeef가 있는지 비교하고있다.
메모리 구조를 예상해보자면
ebp ( 4byte ) |
ebp-4 ( 4byte ) |
ebp-8 ( 4byte ) |
ebp-12 ( 4byte ) |
check ( 4byte, ebp-16 ) |
buf( 40byte ) |
바로 페이로드 작성 :
nop*40 + check( 0xdeadbeef ) + nop*16
프로그램 내부에서 인자를 받으므로 조금 다른 방식으로 페이로드를 보내주어야 한다.
권한 상승이 된것을 확인!
my-pass명령어로 다음레벨의 패스워드를 확인하고 넘어간다.
level14도 클리어