Entwickler-Ecke

Alle Sprachen - Alle Plattformen - C: rdata, data und eine Variable verstecken


tomycat - Mi 29.12.21 15:29
Titel: C: rdata, data und eine Variable verstecken
Hallo zusammen,

Der Code von :
Password Discovery and Patching by Disassembling [https://www.c-sharpcorner.com/UploadFile/ajyadav123/password-discovery-and-patching-by-disassembling/]


C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
#include "stdafx.h"

#include <stdio.h>  
#include <string.h>  
  
#define SIZE 100  
#define PASSWORD ********  
  
//neu
char passwd[ ]="PASSWORD";  
  
#pragma data_seg ()  
#pragma comment(linker, "/SECTION:.Secure,RWS")  
//neu ende



int main ()  
{  
  
int count=0;  
char buff [SIZE]=" ";  
//char passwd[ ]="PASSWORD";  

    printf ("\nWelcome to Console!!\n[You may have only 3 unsuccessful login attempts!]\n");  
    for (;;)  
    {  
    printf ("\Attempt =%d",count+1);  
    printf ("\nEnter the Password:");  
  
    fgets (&buff [0], SIZE,stdin);   
  
        if (strcmp(&buff[0] , &passwd[0]))  
        {  
        printf ("Invalid Password: Try Again\n");            
        }  
        else  
        {  
            break;  
        }  
  
        if (++count>2)  
        {  
            printf ("\nAccess Denied");  
            return -1;  
        }  
    }   
    printf ("Congratulations!!: Valid Credentials\n");  
}


1.Frage:

Warum brauche ich jetzt plötzlich ->> #include "stdafx.h"?

2.Frage:

Der Original Quellcode hat keine Gänsefüsschen ->> char passwd[ ]="PASSWORD";
Warum?

3.Frage:
Mit dumpbin meinprog.exe
habe einen rdata und eine data Block, wo nach orientiert sich der Compiler?

4.Frage
Nach der Änderung mit NEU, siehe Quellcode von oben, soll ein neuer Block entstehen ->> #pragma comment(linker, "/SECTION:.Secure,RWS")
Er ist nicht mit dumpbin meinprog.exe zu sehen.


Moderiert von user profile iconTh69: Topic aus Andere .NET-Sprachen verschoben am Mi 29.12.2021 um 14:38
Moderiert von user profile iconTh69: URL-Titel hinzugefügt.
Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Mi 29.12.21 15:53

Hallo,

zu 1.: Das ist beim Visual Studio Compiler (MSVC) der vorkompilierte Header. Kannst die Zeile löschen, wenn du ihn nicht nutzt.

zu 2.: In Zeile 5 (Listing 1 des Originalcodes) sollen diese stehen, also

Quelltext
1:
#define PASSWORD "********"                    

Bei char passwd[ ]="PASSWORD"; würde dieses ja nicht durch das Makro ersetzt werden.

zu 3.: Deine Frage verstehe ich nicht ganz - das ist einfach der Unterschied von Konstanten/Literalen (.rdata) zu Variablen (.data).

zu 4.: Dir fehlt noch die wichtige Zeile #pragma data_seg (".Secure") vor dem Passwort. ;-)


tomycat - Mi 29.12.21 22:29

thx,

zu 2.
Im Originalen Quellcode ist das ohne Gänsefüsschen und Visual Studio unterstreicht das rot. Mit Gänsefüsschen ist das kein Problem.Warum?

zu 3.
Komisch ist, dass fast der gleiche Quellcode ein rdata erstellt wird und bei einem anderen Quellcode keinen. Der fast das gleiche macht.
Deswegen meine Frage, welche Variablen komme in rdata und welche in data?

Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - Do 30.12.21 11:34

Weil mit Gänsefüßchen nun mal ein String-Literal erzeugt wird. :gruebel:
Der Autor hat einfach sein Passwort für den Artikel durch Sternchen ersetzt (und dabei auch die Gänsefüßchen gelöscht).

Alle String-Literale sollten im .rdata-Bereich erscheinen. Welcher Code erzeugt denn keinen?


tomycat - Sa 01.01.22 19:30

letzte Frage:

C++-Quelltext
1:
if (strcmp(&buff[0] , &passwd[0]))                    


Warum geht der Code nicht?
buff ist PASSWORD und passwd ist PASSWORD. Der Befehl strcmp vergleicht und sagt trotzdem falsch?

Moderiert von user profile iconTh69: Code-Tags hinzugefügt


Th69 - So 02.01.22 10:21

Das liegt am vorherigen fgets [https://de.cppreference.com/w/c/io/fgets].
Da wird bei Eingabe über die Konsole noch das Zeilenendezeichen (Newline) in buff enthalten sein.
Kannst du umstellen auf

Quelltext
1:
scanf("%s", buff);                    

sofern keine Whitespaces (Leerzeichen, Zeilenende, ...) eingelesen werden sollen, ansonsten

Quelltext
1:
scanf("^[\n]", buff);                    

welches nur (ausschließlich) bis zum Zeilenendezeichen liest.

Hinweis: Die Längenbeschränkung des Puffers ist dabei aber nicht berücksichtigt (aber zum Testen bei max. 100 Zeichen reicht es wohl).