인베디드 CTF를 하다가 우연히 알게되서 (C를 헛배워서) 포스팅을합니다
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main(void){ int *p = 0x10; int b = 2; int *result = p - b; printf("%p\n", result); return 0; } | cs |
요약할것도 없는 소스코드 지만 요약하면 *p 에 0x10을 넣고 b에 2를 넣어준다음 빼줍니다
결과는
결과는 0x8입니다.
어셈블리로 보면
이렇게 나타나있는 것을 확인 할 수 있었다.
ebp-0x14가 p이고
ebp-0x10이 b, ebp -0xc가 result이다.
계산과정을 보면 b에다가 shl 연산을 하는 것을 확인 할 수 있는데
shl 연산은 왼쪽으로 시프트 이동이다. 2번 왼쪽 시프트 연산을 하니 X4로 봐도 무방할 것이다.
때문에 0x10 - 4*0x2가 되어 0x8의 결과가 나온다.
이렇게 C언어 포인터를 뺄때는 그 자료형의 숫자 만큼 빼준다는 것을 확인할수 있었다.
다른 예로 봐보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> int main(void){ uint64_t *p = 0x510; int b = 2; uint64_t *result = p - b; printf("%p\n", result); return 0; } | cs |
이거의 값은 0x500이다.
어셈으로보면 shl, 0x3 (x8)하고 빼주는 것을 확인할수 있었다.
끄읕