|  |
| |
| 김답변 |
더 내려가면 보일텐데요 정 안보인다면 다른방법도 있습니다 main함수의 프롤로그와 에필로그를 제외한 부분, 그러니까 메인함수의 스택프레임이 그대로 esp와 ebp에 의해서 가르켜지는 부분 아무곳이나 브레이크포인트를 걸고
그 시점에서 ebp가 가르키는것은 SFP, ebp+4는 리턴어드레스, ebp+8은 argc, ebp+12는 argv배열을 가르킵니다
x/2wx $ebp+12 하시면 argv[0]과 argv[1]이 순서대로 나오고
여기서 x/s argv[1]위치에 있는 주소
하시면 입력하신게 출력되고 주소도 보일겁니다 |
2017/09/27 |
|
| you88311 |
오오 생각해보니 어짜피 인자니 ebp+12로 하는 것도 가능하군요!! 그래도 여전히 본 ftz서버에서는 먹히는데 구축한 ftz서버에서는 안되네요ㅎㅎ 좀 더 공부해봐야겠네요 어쨌든 답변 정말 감사합니다!! |
2017/09/27 |
|
| 김답변 |
이상하네요 ㅋㅋ 올려주신 메모리덤프에보면 본섭에서는 argv[1]이 0xbffffb27, env[0]이 0xbfffffc38
그리고 구축하신거에선 argv[1] = 0xbffffb23, env[0] = 0xbffffc34
두개의 거리차가 같아서 분명 잘 올라갔을것같은데요
FTZ서버를 직접 구축할때의 문제점은 사실 이렇게 gdb로 볼 때 스택에 올라가냐 안올라가냐에서 문제가 생기진 않고 gdb에서 확인한 주소로 리턴했을때 쉘이 안따이는 문제가 있는데, ftz 본섭에서는 스택에 ASLR이 도입되기 전 커널을 쓰고 있고 직접구축하면 스택에 ASLR이 있는 버젼으로 구축하기때문에 스택프레임이나 argv로의 리턴이 어렵고, 스택에 ASLR이 걸려있는데 이상하게 환경변수있는쪽은 ASLR이 없어서 에그쉘이나 RTL을 이용해서 풀어야 합니다 |
2017/09/28 |
|
| you88311 |
아아아아!! 제가 알고 싶었던게 이거였습니다. 서로 커널 버전이 달라 ASLR면에서 차이가 있군요ㅠㅠㅠ 사실 구축한 ftz에서 call strcpy 이곳에 break 걸고 버퍼 확인하면 스택에 4141이 나오는데 그 주소로 아무리 해도 쉘이 안나오더군요. while문으로 반복 돌려도 해결이 안돼서 뭔가 잘못하고있구나 싶어서 아예 초반 함수 프롤로그??에 break걸고 인자 확인한 건데 여기서는 아예 argv가 안본여서 질문한거였습니다. 포맷 스트링이랑 환경변수로는 다 되는데 이 공격만 안통하더구요.
덕분에 속시원하게 알아갑니다. 감사합니다!!! |
2017/09/28 |
|