System&Write up 87

[pwnable.kr] Toddler's Bottle - lotto

[pwnable.kr] Toddler’s Bottle - lotto 나머지, main과 help 함수는 분기와 출력 밖에 없어서 가져오지 않았습니다. 우선 6byte를 입력합니다. 그리고 /dev/urandom에서 난수를 가져와서 범위를 1~45로 만듭니다. 숫자가 맞으면 continue를 이용해서 중복 체크(?) 후 다음 루프를 돌아야 하는데, 그렇지 않습니다. 총 6 X 6 = 36번 비교를 해서 6번 같아야 합니다. 같은 값 6개를 입력했을 때, lotto 배열의 값 중 하나만 그 값과 동일하다면 flag를 출력하겠네요. 당연히 확률도 월등히 높아지겠죠. 그렇다고 숫자를 6개 입력한다거나 하면 flag가 출력되지 않습니다. 정수로 받는 것이 아니기 때문에 48 ~ 57 범위의 값이 들어가게 됩니다...

[pwnable.kr] Toddler's Bottle - blackjack

[pwnable.kr] Toddler’s Bottle - blackjack millionares. 백만장자에게 flag를 준다고 합니다. 들어가면 화려한 아스키아트를 볼 수 있습니다. 게임 진행, 룰 확인, 게임 나가기 3가지 기능이 있습니다. 룰을 보고 게임을 좀 해봤는데 1승 4패였습니다ㅜㅜ 각설하고, 링크 들어가보면 긴 C 코드가 있습니다. 아스키아트가 많아서 빠르게 읽을 수 있었습니다. 랜덤 카드 생성, 게임 실행 후 이러쿵 저러쿵 초기 셋팅하는 부분을 지나고 났는데 이상한 부분을 발견했는데요. 베팅 금액이 가진 돈보다 큰가? 검사해서 베팅 금액이 크다면 입력을 다시 받고, 다시 검사해야하는 게 맞습니다. 하지만 이 코드에서는 if문 안에서 다시 입력을 받기 때문에 가지고 있는 돈보다 많은 양의 ..

FTZ level20 -> clear Write up(Python)

FTZ 20 Level printf에 bleh라는 문자열을 바로 집어 넣으면서 FSB 취약점이 생기게 됩니다. printf에서 %x를 쓰면 ebp-8부터 -4씩 감소하면서 인자를 읽어 오게 됩니다. 여기서 확인할 수 있는 것은 bleh 배열의 시작 위치와 printf의 ebp+8 사이에는 12byte의 공간이 존재한다는 것입니다. bleh 배열의 시작 위치는 ebp+20이라는 것을 알 수 있습니다. 그리고 %n와 %정수c를 이용해서 원하는 주소의 메모리에 원하는 값을 넣을 수 있습니다. 고정된 주소인 main 함수의 소멸자 부분 .dtors의 __DTOR_END__의 값을 셸코드의 주소로 변조하면 main 함수가 끝난 후에 쉘이 실행될 것입니다. 0x08049594입니다. __DTOR_END__는 +4 ..

FTZ level17 -> level18 Write up(Python)

FTZ 17 Level ebp-56, buf의 시작 주소. ebp-16, call 함수 포인터의 주소. level17_parents.py 입니다. putenv 함수는 자식 프로세스에서 영향을 미치기 때문에, 제일 위에서 프로그램이 돌고 있도록 만들었습니다. level17_1.py 입니다. 여기서 사용하는 getSC 코드는 이렇습니다. 여기서 출력하는 환경 변수의 주소 문자열을 읽어와서 long 타입으로 캐스팅합니다. level17_2.py 입니다. 이 파일이 출력된 payload를 읽어서 attackme 파일에 전달해줍니다. 감사합니다.

반응형