|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=33282 [복사]
해커스쿨 ftz 푸는중인데 풀이보면서..
근데 똑같이 하는데 크기가 안맞는겁니다..
그래서 제가 버퍼크기 이것저것 만들어보면서
gdb로 더미바이트가 얼마나 붙는지 확인하는 작업을 했는데..
풀이에서는 더미바이트가 되게 간단한 규칙으로 붙는것처럼 나와있는데
직접 실험해보니까 경우가 너무 다양하더라구요.
일단, char 배열로 8바이트까지 늘리면서 확인했는데
char a[1]~[2] 까지는 8바이트인데 a[3]에서는 24바이트로 껑충 뜁니다.
(sub $0x18,%esp)
a[4]는 또 8바이트고요.
a[5]~[7]까지는 24바이트.
a[8]은 8바이트
a[9]~ [16]까지 24바이트
a[17]~ 40바이트
이렇게 되는데.
또 이상한게
char a[3];
char a[17];
선언해서 보면 56바이트가 할당됩니다.(sub $0x38,%esp)
제가
이 더미바이트란게 변수들 총합해서 버퍼의 총 크기를 가지고 계산하는건지 각각 변수마다 더미바이트를 따로 계산하는건지 잘 모르는상태인데
근데 이 두가지의 어떤 경우라도 위의 결과를 봤을 땐 말이 안되는 상황이에요.
총버퍼크기를 구한후에 더미바이트를 계산하는거라면,
(변수들 총합에서 16바이트 단위로 버퍼를 할당한 후에 8바이트 더미를 붙이는거니까) 합하면 총 20바이트고 그럼 40(32+8)바이트가 할당되야 하는데 위에선 56바이트로 나왔으니 아니고..
각각 따로 계산하는거라면
a[3]은 앞서서 24바이트였고
a[17]은 40바이트였으니 총합해서 64바이트가 할당되야 하는데..
역시 아니고..
왜 대체 56바이트인지..
버퍼오버플로우 문제 풀때
더미바이트 대체 어떻게 계산해야 하는건지요 ㅠㅠ
gcc 버전은 3.2.2 고(ftz 자체구축한 서버에서 실험했습니다.)
|
Hit : 9366 Date : 2015/04/17 01:57
|