포인터 빼기?

Coding/C 2017. 3. 21. 16:31

인베디드 CTF를 하다가 우연히 알게되서 (C를 헛배워서) 포스팅을합니다


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void){
 
        int *= 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 *= 0x510;
        int b = 2;
        uint64_t *result = p - b;
 
        printf("%p\n", result);
 
        return 0;
}
cs


이거의 값은 0x500이다.



어셈으로보면 shl, 0x3 (x8)하고 빼주는 것을 확인할수 있었다.


끄읕

블로그 이미지

powerprove

,